如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示

Posted

技术标签:

【中文标题】如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示【英文标题】:How to split a column with comma separated values and store in array in PySpark's Dataframe? As given below 【发布时间】:2020-03-10 21:43:44 【问题描述】:

我有一个 PySpark 数据框,其中有一列包含逗号分隔值。值的数量 该列包含是固定的(比如 4)。示例:

+------------------------+
|col1                    |
+------------------------+
|1,val1, val4            |
|2,val1                  |
|3,val1, val2, val3      |
|4,val1, val2, val3, val4|
+------------------------+

现在我希望它被分成 2 列,如下所示

+----+------------------------+
|col1|col2                    |
+----+------------------------+
|   1|[val1, val4]            |
|   2|[val1]                  |
|   3|[val1, val2, val3]      |
|   4|[val1, val2, val3, val4]|
+----+------------------------+

如何做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用slice 和split 实现此功能:

from pyspark.sql.functions import col, split, slice

array_len = 4
df.withColumn("ar", split(col("col1"), ",")) \
  .select(
     col("ar")[0].alias("col1"), 
     slice(col("ar"), 2, array_len).alias("col2")
  )

# +----+---------------------------+
# |col1|col2                       |
# +----+---------------------------+
# |1   |[val1,  val4]              |
# |2   |[val1]                     |
# |3   |[val1,  val2,  val3]       |
# |4   |[val1,  val2,  val3,  val4]|
# +----+---------------------------+

首先我们将数组拆分并存储到ar,接下来我们使用select检索数组的第一项col("ar")[0]和数组的其余部分slice(col("ar"), 2, array_len),这将返回除第一项之外的所有项目一个。

【讨论】:

切片中的2是什么意思? 我们保留2-4项,切片函数从1开始计数 好的明白了,但为什么要手动定义array_len?有没有办法像我们在 pandas iloc[10:] 中那样指定范围,这意味着第十行及以后。 不,切片只接受整数@Sid_K(甚至不接受列,即size(col("ar")) 酷。谢谢亚历克斯!

以上是关于如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中拆分逗号分隔的字符串?

我可以使用 SQL 将存储为 CSV(逗号分隔值)的表列的内容拆分为新表中的单独行吗?

如何将逗号分隔的值拆分为列

如何根据oracle plsql中列中的逗号分隔值拆分选择查询行

拆分特定的 PySpark df 列并创建另一个 DF

pyspark 从逗号分隔值列表中创建多行