如何转换由 | 分隔的顺序数据并且在 pyspark 中的行和列中没有换行符

Posted

技术标签:

【中文标题】如何转换由 | 分隔的顺序数据并且在 pyspark 中的行和列中没有换行符【英文标题】:how to convert a sequential data seperated by | and does not have newline character into rows and columns in pyspark 【发布时间】:2021-07-25 08:21:45 【问题描述】:

我正在尝试读取具有由 | 分隔的顺序数据的文本文件如下。

1|Ariyalur|1|2|3|2|Coimbatore|4|6|1.12|3|Cuddalore|8|3|7

我希望 spark 将其作为数据帧读取,并将第 5 个分隔符(即 |)替换为 \n。 输出应该是

Serial_Number|District|Area|Production|profit
1|Ariyalur|1|2|3
2|Coimbatore|4|6|1.12
3|Cuddalore|8|3|7

使用replace函数替换所有|。如何仅替换 | 的第 5 个实例。

【问题讨论】:

【参考方案1】:

在尝试了几种不同的方法后,我认为应用正则表达式模式是最好的分割方法,它有点棘手,但它有效

split_token = '~' # this is the token to split, you can decide what's the best token depends on your data

(df
    .withColumn('tmp', F.regexp_replace(F.col('seq'), '(([^\|]+)\|)4[^\|]+', f'$0split_token')) # Add split token         =====>   1|Ariyalur|1|2|3~|2|Coimbatore|4|6|1.12~|3|Cuddalore|8|3|7~
    .withColumn('tmp', F.explode(F.split(F.col('tmp'), f'split_token\|?')))                       # Explode by split token  =====>   [ 1|Ariyalur|1|2|3, 2|Coimbatore|4|6|1.12, 3|Cuddalore|8|3|7, ]
    .withColumn('tmp', F.split(F.col('tmp'), '\|'))                                                 # Split by pipe (|)       =====>   [ 1, Ariyalur, 1, 2, 3 ]
    .withColumn('serial_number', F.col('tmp')[0]) # extract `serial_number`
    .withColumn('district', F.col('tmp')[1])      # extract `district`
    .withColumn('area', F.col('tmp')[2])          # extract `area`
    .withColumn('production', F.col('tmp')[3])    # extract `production`
    .withColumn('profit', F.col('tmp')[4])        # extract `profit`
    .drop('seq', 'tmp')                           # clean up
    .where(F.col('profit').isNotNull())           # clean up
    .show(10, False)
)

# +-------------+----------+----+----------+------+
# |serial_number|district  |area|production|profit|
# +-------------+----------+----+----------+------+
# |1            |Ariyalur  |1   |2         |3     |
# |2            |Coimbatore|4   |6         |1.12  |
# |3            |Cuddalore |8   |3         |7     |
# +-------------+----------+----+----------+------+

【讨论】:

以上是关于如何转换由 | 分隔的顺序数据并且在 pyspark 中的行和列中没有换行符的主要内容,如果未能解决你的问题,请参考以下文章

在Python里 请问怎么将数字日期转换成英文月份加数字日期? 并且替换分隔符?例子如下

如何确保 BULK INSERT 将按顺序插入我的平面文件行?

如何在pyspark中将GUID转换为整数

如何让一个字符串(由多个小字符串,中间以逗号分隔开)转换成stringlist类

ruby 转换由浮点分隔的逗号分隔的数字整数或浮点数

如何编写用于将分隔字符串转换为列表的通用扩展方法?