pyspark 在spark Dataframe 中部分替换json属性

xlpyo6sf  于 2022-11-28  发布在  Spark
关注(0)|答案(1)|浏览(143)

**环境:**我使用的是带有spark 3.3.0和Python 3的数据库。
**尝试解决的问题:**我正在尝试替换json结构列的某些属性值。我有一个 Dataframe ,其中包含具有以下json内容结构的结构类型列:

| 识别码|myCol语言|
| - -|- -|
| 一个|{“属性1”:“abcde”,“属性2”:“def”、“att3”:“defg”、“att4”:“defabc”}|
| 2个|{“属性1”:“xyfp”,“属性2”:“asdf”,“属性3”:“二将”、“att 4”:“asdfg”}|
| 三个|{“属性1”:“fjhj”,“属性2”:“zxcxzvc”,“属性3”:“wtwert”、“att4”:“mjgkj”}|
Dataframe 包含数千条记录,我对spark编程还不太熟悉,所以我一直很难找到一种方法,将 Dataframe 中所有行的“att 1”和“att 3”值替换为相同的值,但只保留前两个字符,并屏蔽其余字符,即从上面的示例:
预期输出:
| 识别码|myCol语言|
| - -|- -|
| 一个|{“属性1”:“ab---",“属性2”:“def”、“att3”:“de--"、“att4”:“defabc”}|
| 2个|{“属性1”:“xy--",“属性2”:“asdf”,“属性3”:“呃----",“att 4”:“asdfg”}|
| 三个|{“属性1”:“fj--",“属性2”:“zxcxzvc”,“属性3”:“重量----"、“属性4”:“mjgkj”}|
我正在研究可能使用org.apache.spark.sql.functions.regexp_replace,但我不知道如何只替换部分值,即从"abcde""ab---",我在网上看过类似的例子,除了其中每一个替换整个值,值是事先知道的,如https://stackoverflow.com/a/68899109/1994202,但是,我需要保留前两个原始字符,值不是静态的。
有什么建议吗?表现也很重要

wswtfjt7

wswtfjt71#

Lookbehind将帮助您选择要替换的正确字符:
(?<=..).
上方表示“任何字符,如果它前面有两个字符。这不会选择第一个或第二个字符,因为它们前面没有/只有一个字符。
因此:

df.withColumn("myCol", col("myCol").withField("att1", regexp_replace(col("myCol.att1"), "(?<=..).", "-"))
                                   .withField("att3", regexp_replace(col("myCol.att3"), "(?<=..).", "-"))).show()

相关问题