将带有空值的列值扩展/分解为 Pyspark 中的多行
Expanding / Exploding column values with Nulls into multiple rows in Pyspark
我有以下数据:
我想展开此数据以获得以下数据:
我试过以下代码:
df = (df
.selectExpr("id",
"split(col1, ',') col1",
"split(col2, ',') col2",
"split(col3, ',') col3")
.withColumn("arr", F.expr("arrays_zip(col1, col2, col3)"))
.selectExpr("id", "inline(arr)"))
df.show()
此代码产生 0 行。
所以我尝试使用命令 'inline_outer':
df = (df
.selectExpr("id",
"split(col1, ',') col1",
"split(col2, ',') col2",
"split(col3, ',') col3")
.withColumn("arr", F.expr("arrays_zip(col1, col2, col3)"))
.selectExpr("id", "inline_outer(arr)"))
df.show()
此代码返回所有行,但没有任何值。
现阶段我对为什么会发生这种情况感到困惑,就好像我公开了原始列(例如没有拆分的 col1 等)值在那里。
欢迎提出任何建议。
使用 arrays_zip
和 null
值 returns null
。对于您的情况,我们需要空数组而不是空数组。
cnd = "arrays_zip(coalesce(col1,array()),coalesce(col2,array()),coalesce(col3,array()))"
df = df.selectExpr("id","split(col1, ',') col1","split(col2, ',') col2","split(col3, ',') col3").\
withColumn("arr", F.expr(cnd)).selectExpr("id", "inline_outer(arr)")
df.show()
+---+----+----+----+
|id |0 |1 |2 |
+---+----+----+----+
|x |1 |a |c |
|x |2 |b |c |
|x |3 |c |c |
|y |null|null|null|
|z |12 |null|c |
|z |3 |null|null|
+---+----+----+----+
我有以下数据:
我想展开此数据以获得以下数据:
我试过以下代码:
df = (df
.selectExpr("id",
"split(col1, ',') col1",
"split(col2, ',') col2",
"split(col3, ',') col3")
.withColumn("arr", F.expr("arrays_zip(col1, col2, col3)"))
.selectExpr("id", "inline(arr)"))
df.show()
此代码产生 0 行。 所以我尝试使用命令 'inline_outer':
df = (df
.selectExpr("id",
"split(col1, ',') col1",
"split(col2, ',') col2",
"split(col3, ',') col3")
.withColumn("arr", F.expr("arrays_zip(col1, col2, col3)"))
.selectExpr("id", "inline_outer(arr)"))
df.show()
此代码返回所有行,但没有任何值。
现阶段我对为什么会发生这种情况感到困惑,就好像我公开了原始列(例如没有拆分的 col1 等)值在那里。
欢迎提出任何建议。
使用 arrays_zip
和 null
值 returns null
。对于您的情况,我们需要空数组而不是空数组。
cnd = "arrays_zip(coalesce(col1,array()),coalesce(col2,array()),coalesce(col3,array()))"
df = df.selectExpr("id","split(col1, ',') col1","split(col2, ',') col2","split(col3, ',') col3").\
withColumn("arr", F.expr(cnd)).selectExpr("id", "inline_outer(arr)")
df.show()
+---+----+----+----+
|id |0 |1 |2 |
+---+----+----+----+
|x |1 |a |c |
|x |2 |b |c |
|x |3 |c |c |
|y |null|null|null|
|z |12 |null|c |
|z |3 |null|null|
+---+----+----+----+