逆向引用PySpark(三. 字符串篇)

这是一篇逆向PySpark系列的字符串版本,总结了在这种情况下应该怎么做。
(将不断进行更新。)

    • 原則としてApache Spark 3.3のPySparkのAPIに準拠していますが、一部、便利なDatabricks限定の機能も利用しています(利用しているところはその旨記載しています)。

 

    • Databricks Runtime 11.3 上で動作することを確認しています。

 

    • ノートブックをこちらのリポジトリ からReposにてご使用のDatabricksの環境にダウンロードできます。

 

    逆引きPySparkの他の章については、こちらの記事をご覧ください。

例句的前提条件

    SparkSessionオブジェクトがsparkという変数名で利用可能なこと

整形手术的意思是通过外科手术来改变或修复人体外貌或身体结构。

将3-1-1变成大写字母。

使用upper()函数将字符串转换为大写字母。

# 構文
df.withColumn( <追加するカラム名>, F.upper(<文字列型のカラム>) )

# 例文
from pyspark.sql import functions as F

df = ( df.withColumn( "first_name_upper", F.upper("first_name") )
         .withColumn( "last_name_upper", F.upper("last_name") ) )

例子是工作时所投入的能量和努力。

numberfirst_namelast_namefirst_name_upperlast_name_upper110LionelMessiLIONELMESSI29JulianAlvarezJULIANALVAREZ322LautaroMartinezLAUTAROMARTINEZ

3-1-2 改成小字

使用lower()函数将字符串转换为小写字母。

# 構文
df.withColumn( <追加するカラム名>, F.lower(<文字列型のカラム>) )

# 例文
from pyspark.sql import functions as F

df = ( df.withColumn( "first_name_lower", F.lower("first_name") )
         .withColumn( "last_name_lower", F.lower("last_name") ) )

例子来说明

numberfirst_namelast_namefirst_name_lowerlast_name_lower110JulianAlvarezlionelmessi29LautaroMartinezjulianalvarez322LionelMessilautaromartinez

将3-1-3中的每个单词的首字母改为大写

使用initcap()函数,将单词的首字母变为大写。

# 構文
df.withColumn( <追加するカラム名>, F.initcap(<文字列型のカラム>) )

# 例文
from pyspark.sql import functions as F

df = ( df.withColumn( "first_name_initcap", F.initcap("first_name") )
         .withColumn( "last_name_initcap", F.initcap("last_name") ) )

出力例的翻译如下:例子的产出。

numberfirst_namelast_namefirst_name_initcaplast_name_initcap110LIONELMESSILionelMessi29JULIANALVAREZJulianAlvarez322LAUTAROMARTINEZLautaroMartinez

整理数字为 3-1-4.

使用format_number()函数,对数值进行格式化处理。

# 構文
df.withColumn( <追加するカラム名>, F.format_number(<数値型のカラム>, <小数点以下の桁数>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "salary_formatted", F.format_number( "salary", 2 ) ) )

输出示例

numberfirst_namelast_namesalarysalary_formatted110LionelMessi4100000041,000,000.0029JulianAlvarez31300003,130,000.00322LautaroMartinez63750006,375,000.00

以带有格式的方式输出字符串3-1-5。

使用format_string()函数,以printf格式输出字符串。

# 構文
df.withColumn( <追加するカラム名>, F.format_string(<書式>, <カラム>[,<カラム>...]) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "string_formatted", F.format_string( "%s's number is %d", "last_name", "number" ) ) )

输出实例

numberfirst_namelast_namestring_formatted110LionelMessiMessi’s number is 1029JulianAlvarezAlvarez’s number is 9322LautaroMartinezMartinez’s number is 22

3-1-6 左侧进行填充(靠右对齐)

使用lpad()函数,在指定的字符长度之前,在左侧填充指定的字符。填充的目标列可以是字符串类型或数值类型都可以。

# 構文
df.withColumn( <追加するカラム名>, F.lpad(<カラム>, <文字列長>, <パディングに使う文字>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "number_padded", F.lpad( "number", 4, "0" ) ) )

输出示例 (chū lì lì)

numberfirst_namelast_namenumber_padded110LionelMessi001029JulianAlvarez0009322LautaroMartinez0022

将 3-1-7 右侧进行填充(左对齐)

使用rpad()函数,在指定的字符串长度之前,在右侧填充指定的字符。要填充的列可以是字符串类型,也可以是数字类型。

# 構文
df.withColumn( <追加するカラム名>, F.rpad(<カラム>, <文字列長>, <パディングに使う文字>) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "number_padded", F.rpad( "number", 4, "0" ) )

工作示例

numberfirst_namelast_namenumber_padded110LionelMessi100029JulianAlvarez9000322LautaroMartinez2200

删除3-1-8左侧的空白字符

使用ltrim()函数,删除字符串左侧的空白字符。

# 構文
df.withColumn( <追加するカラム名>, F.ltrim(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "first_name_trimmed", F.ltrim( "first_name" ) )

输出实例

numberfirst_namelast_namefirst_name_trimmed110LionelMessiLionel29JulianAlvarezJulian322LautaroMartinezLautaro

删除右侧的空白字符

使用rtrim()函数来删除字符串右侧的空白字符。

# 構文
df.withColumn( <追加するカラム名>, F.rtrim(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "first_name_trimmed", F.rtrim( "first_name" ) )

输出示例

numberfirst_namelast_namefirst_name_trimmed110LionelMessiLionel29JulianAlvarezJulian322LautaroMartinezLautaro

删除两端的空白字符

使用trim()函数,可以删除字符串左右两端的空白字符。

# 構文
df.withColumn( <追加するカラム名>, F.trim(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "first_name_trimmed", F.trim( "first_name" ) )

例子:工作产出

numberfirst_namelast_namefirst_name_trimmed110LionelMessiLionel29JulianAlvarezJulian322LautaroMartinezLautaro

3-2 搜索、提取

查找指定字符首次出现的位置为3-2-1。

使用instr()函数可以从字符串中搜索子字符串第一次出现的位置(如果是第一次出现,则返回1)。如果未找到子字符串,则返回0。

# 構文
df.withColumn( <追加するカラム名>, F.instr(<検索対象の文字列型カラム>, <検索する部分文字列>) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "instr_position", F.instr( "what_is", "open" ) )

例子 of output

namewhat_isposition1MLflowMLflow is an open source platform for managing the end-to-end machine learning lifecycle. It tackles four primary functions142Delta LakeDelta Lake is an open-source storage framework that enables building a Lakehouse architecture with compute engines including Spark, PrestoDB, Flink, Trino, and Hive and APIs for Scala, Java, Rust, Ruby, and Python.183Apache SparkApache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.0

找出指定位置以后出现指定字符的第一个位置。

使用locate()函数,在指定位置之后的字符串中查找子字符串首次出现的位置(如果找到了,返回1)。如果未找到子字符串,则返回0。

# 構文
df.withColumn( <追加するカラム名>, F.instr(<検索する部分文字列>, <検索対象の文字列型カラム>[, <検索する最初の位置>]) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "locate_position", F.locate( "is", "proverb", 10 ) )

出力例:
– 实例输出

proverblocate_position1Time is money02Speech is silver, silence is golden273Art is long, life is short19

提取3-2-3部分的子字符串

使用substring()函数,根据位置和长度从字符串中提取子字符串。指定部分字符串的起始位置时,将第一个字符计为1,而非0。

# 構文
df.withColumn( <追加するカラム名>, F.substring(<文字列型カラム>, <部分文字列の開始位置>, <部分文字列の長さ>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "substring", F.substring( "proverb", 22, 5 ) ) )

例子输出

proverbsubstring1Time is money
2Speech is silver, silence is goldenence3Art is long, life is shortshort

提取与正则表达式匹配的部分的3-2-4。

使用regexp_extract()函数,通过正则表达式从字符串中提取子字符串。

你可以参考以下页面的目录来了解正则表达式模式的语法:
参考:【Java】正则表达式汇总

# 構文
df.withColumn( <追加するカラム名>, F.regexp_extract(<文字列型カラム>, <正規表現パターン>, <マッチ文字列の何番目の要素を抽出するか>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "hyphon", F.regexp_extract( "what_is", r"\w+-\w+", 0 ) ) )

例子的输出

namewhat_ishyphon_word1MLflowMLflow is an open source platform for managing the end-to-end machine learning lifecycle. It tackles four primary functionsend-to2Delta LakeDelta Lake is an open-source storage framework that enables building a Lakehouse architecture with compute engines including Spark, PrestoDB, Flink, Trino, and Hive and APIs for Scala, Java, Rust, Ruby, and Python.open-source3Apache SparkApache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.multi-language

提取包含特定分隔符出现指定次数的子字符串,直到达到指定次数为止。

使用substring_index()函数,从字符串中提取出指定分隔符出现指定次数之前的子字符串。

# 構文
df.withColumn( <追加するカラム名>, F.substring_index(<文字列型カラム>, <区切り文字>, <登場回数>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "subdomain", F.substring_index( "domain", ".", 1 ) ) )

产出示例

namedomainsubdomain1Apache Sparkspark.apache.orgspark2Apache Kafkakafka.apache.orgkafka3Apache Parquetparquet.apache.orgparquet

提取以指定的字符串开头的字符串:3-2-6.

您可以使用startswith()函数来确定某列是否以特定字符串开头。

# 構文
df.filter( F.col(<文字列型カラム>).startswith(<開始文字列>) )

# 例文
from pyspark.sql import functions as F

display( df.filter( F.col( "name" ).startswith( "Apache" ) ) )

工作范例

namewhat_is1Apache SparkApache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.2Apache ParquetApache Parquet is an open source, column-oriented data file format designed for efficient data storage and retrieval.3Apache AirflowAirflow is a platform created by the community to programmatically author, schedule and monitor workflows.

抽取以指定字符串结尾的字符串是3-2-7. yǐ de shì 3-2-7.)

使用Column的endswith()函数,可以判断一个字符串是否以特定的字符串结尾。

# 構文
df.filter( F.col(<文字列型カラム>).endswith(<終了文字列>) )

# 例文
from pyspark.sql import functions as F

display( df.filter( F.col( "name" ).endswith( "flow" ) ) )

例子中的输出

namewhat_is1MLflowMLflow is an open source platform for managing the end-to-end machine learning lifecycle. It tackles four primary functions.2Apache ParquetAirflow is a platform created by the community to programmatically author, schedule and monitor workflows.

3-3交换

正则表达式匹配并替换3-3-1的部分。

使用regexp_replace()函数,对字符串进行操作,将符合正则表达式的部分替换为另一个字符串。

您可以参考以下页面的列表来了解正则表达式模式的语法。
参考:【Java】正则表达式总结

# 構文
df.withColumn( <追加するカラム名>, F.regexp_replace(<文字列型カラム>, <正規表現パターン>, <置換に使う文字列>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "note_wo_phone", F.regexp_replace( "note", r"\d{3}-\d{4}-\d{4}", "<redacted>" ) ) )

产量的例子

note_takernotenote_wo_phone1YamadaMy phone is 090-0012-3456. please call me backMy phone is <redacted>. please call me back2Tanaka電話番号は090-0123-4567です電話番号は<redacted>です3Suzuki070-0012-3456に連絡欲しいとのことです<redacted>に連絡欲しいとのことです

在指定的位置覆盖(插入)字符串

使用overlay()函数可以在字符串上覆盖或插入指定位置的字符串。

# 構文
df.withColumn( <追加するカラム名>, F.overlay(<文字列型カラム>, <上書きする文字列型カラム>, <上書きする位置>[, <上書きする長さ>]) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "overlayed", F.overlay( "original", "phrase", "pos", "len" ) ) )

力量展示

originalphraseposlenoverlayed1SPARK_SQLCORE7-1SPARK_CORE2SPARK_SQLSTREAMING72SPARK_STREAMINGL3SPARK_SQLPY10PYSPARK_SQL

将3-3-3中的每个数字替换为不同的文字。

使用translate()函数,在字符串中,如果存在指定的字符,则用指定的字符进行替换。以下,如果字符串型列中存在<被替换字符>,则将相应位置上的字符用<替换字符>进行替换。

# 構文
df.withColumn( <追加するカラム名>, F.translate(<文字列型カラム>, <置換される文字>, <置換する文字>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "order_corrected", F.translate( "order", "olSeg", "01569" ) ) )

出力示例

itemorderorder_corrected1sofal234S123452chairg9993tableSo0500

3-4 分割・結合 可以理解为将一个整体分成3到4个部分,或者将多个部分合并成一个整体。

使用正则表达式将指定位置进行分割的3-4-1方法。

使用split()函数,通过使用正则表达式模式来分割字符串。

    • <最大回数>が0より大きい時: 最大でこの回数まで分割されます。

 

    <最大回数>が0以下の時: 回数に制限なく、正規表現のパターンに従って分割されます。

可以参考以下页面的列表来了解正则表达式模式的语法。
参考链接:【Java】正则表达式汇总

# 構文
df.withColumn( <追加するカラム名>, F.split(<文字列型カラム>, <正規表現パターン>[, <最大回数>]) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "number_split", F.split( "number", "[()-]", -1 ) )

输出示例

companynumbernumber_split1ABC trading(06)1234-5678[“”, “06”, “1234”, “5678”]2XYZ company(03)1234-5678[“”, “03”, “1234”, “5678”]3shop123090-0012-3456[“090”, “0012”, “3456”]

以指定的语言将3-4-2分割成单词。

使用sentences()函数,根据区域设置将字符串分割为单词。区域设置指定语言和国家。如果未指定区域设置,则使用环境的默认区域设置。

# 構文
df.withColumn( <追加するカラム名>, F.sentences(<文字列型カラム>[, <言語を指定するカラム>, <国を指定するカラム>]) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "example_split", F.sentences( "example", "language", "country" ) ) )

例子的输出

examplelanguagecountryexample_split1これは私のペンですjaJP[[“これは”, “私”, “の”, “ペン”, “です”]]2This is my penenUS[[“This”, “is”, “my”, “pen”]]3PySparkは、Spark SQLをPythonで扱うことのできるライブラリですjaJP[[“PySpark”, “は”, “Spark”, “SQL”, “を”, “Python”, “で”, “扱”, “うことのできる”, “ライブラリ”, “です”]]

将3-4-3的字符串和其他文本串联起来。

可以使用concat()函数来连接字符串等。可以设置多个要连接的列。

# 構文
df.withColumn( <追加するカラム名>, F.concat(<文字列型カラム>[,...<文字列型カラム>]) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "concatenated", F.concat( "title", F.lit(". "), "first_name", F.lit(" "), "last_name" ) ) )

Some possible paraphrases in Chinese for “出力例” could be:
– 示例输出
– 输出案例
– 举例输出
– 范例输出

titlefirst_namelast_nameconcatenated1MsHanakoYamadaMs. Hanako Yamada2MrIchiroTanakaMr. Ichiro Tanaka3DrNatsukoSuzukiDr. Natsuko Suzuki

使用3-4-4的分隔符号将字符串连接起来。

使用concat_ws()函数,可以使用特定的分隔符将字符串等连接起来。可以设置多个要连接的列。

# 構文
df.withColumn( <追加するカラム名>, F.concat_ws(<区切り文字>,<文字列型カラム>[,...<文字列型カラム>]) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "concatenated", F.concat_ws( "-", "code", "number_1", "number_2" ) ) )

输出示例

codenumber_1number_2concatenated1A012345678A-0123-456782B002033445B-0020-334453C110009876C-1100-09876

将3-4-5个字符串重复拼接在一起

使用repeat()函数,将指定次数的字符串重复连接在一起。

# 構文
df.withColumn( <追加するカラム名>, F.repeat(<文字列型カラム>,<繰り返し回数>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "code_repeated", F.repeat( "code", 2 ) ) )

以下是一个本地化的汉语释义:努力的例子

numbercodecode_repeated11abcabcabc22xyzxyzxyz33123123123

3-5 转换

获得3-5-1的第一个字符的ASCII码。

使用ascii()函数,获取字符串的第一个字符的ASCII代码。

# 構文
df.withColumn( <追加するカラム名>, F.ascii(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "ascii_code", F.ascii( "code" ) ) )

工作示范

numbercodeascii_code11abc9722xyz1203312349

将3-5-2文字串使用BASE64进行编码。

使用base64()函数,将字符串进行BASE64编码。

# 構文
df.withColumn( <追加するカラム名>, F.base64(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "base64_encoded", F.base64( "code" ) ) )

出力例:工作示例

numbercodebase64_encoded11abcYWJj22xyzeHl633123MTIz

解码3-5-3 BASE64编码字符串

使用unbase64()函数,将被BASE64编码的字符串解码为二进制类型的列,并将其转换为字符串类型。

# 構文
df.withColumn( <追加するカラム名>, F.unbase64(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "original_code", F.unbase64( "base64_encoded" ).cast("string") ) )

例子展示了产出的实例。

numberbase64_encodedoriginal_code11YWJjabc22eHl6xyz33MTIz123

将输入的字符集转换为二进制。

使用encode()函数,将字符串转换为指定字符集的二进制。

# 構文
df.withColumn( <追加するカラム名>, F.encode(<文字列型カラム><キャラクターセット>) )

# 例文
from pyspark.sql import functions as F

df.withColumn( "encoded", F.encode( "nihongo", "UTF-8" ) ).printSchema()

输出示例

|– number:长整型(可为空)
|– 日本语:字符串(可为空)
|– 编码:二进制(可为空)

解码将指定字符集的3-5-5二进制转换为字符串。

使用decode()函数,将以特定字符集编码的二进制数据解码并提取为字符串。

# 構文
df.withColumn( <追加するカラム名>, F.decode(<バイナリ型カラム>, <キャラクターセット>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "encoded", F.encode( "nihongo", "UTF-8" ) )
           .withColumn( "decoded", F.decode( "encoded", "UTF-8" ) ) )

输出示例

nihongoencodeddecoded1あいうえお44GC44GE44GG44GI44GKあいうえお2かきくけこ44GL44GN44GP44GR44GTかきくけこ3さしすせそ44GV44GX44GZ44Gb44Gdさしすせそ

将”3-5-6″编码为SoundEx。

使用soundex()函数将字符串编码为SoundEx。

# 構文
df.withColumn( <追加するカラム名>, F.soundex(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "soundex", F.soundex( "fruit" ) ) )

例子如下

numberfruitsoundex11appleA14022orangeO65233strawberryS361

3-6 其他

获取文本长度

使用length()函数来获取字符串的长度。包括前后空白也会计算在内。

# 構文
df.withColumn( <追加するカラム名>, F.length(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "length", F.length( "fruit" ) ) )

发挥实例

numberfruitlength11apple522orange633いちご3

获取 3-6-2 位的比特长度。

使用bit_length()函数获取字符串的位长度。

# 構文
df.withColumn( <追加するカラム名>, F.bit_length(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "bit_length", F.bit_length( "fruit" ) ) )

出力例的汉语表达可以是:示例输出

numberfruitbit_length11apple4022orange4833いちご72

获取3-6-3八位元长度

使用octet_length()函数来获取字符串的八位字节长度。

# 構文
df.withColumn( <追加するカラム名>, F.octet_length(<文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "octet_length", F.octet_length( "fruit" ) ) )

出力例的中文意思是「输出例子」。

numberfruitoctet_length11apple522orange633いちご9

获取3-6-4的莱文斯坦距离

使用levenshtein()函数,获得字符串之间的莱文斯坦距离。

# 構文
df.withColumn( <追加するカラム名>, F.levenshtein(<文字列型カラム>, <文字列型カラム>) )

# 例文
from pyspark.sql import functions as F

display( df.withColumn( "levenshtein_distance", F.levenshtein( "left", "right" ) ) )

产量实例

leftrightoctet_length1tupleapple22rangeorange13いなごいちご1
bannerAds