下表將是輸入資料框
| col1 | col2 | col3 |
|---|---|---|
| 1 | 12;34;56 | 澳大利亞;SL;新西蘭 |
| 2 | 31;54;81 | 工業;美國;英國 |
| 3 | 空值 | 禁止 |
| 4 | 內德 | 空值 |
預期的輸出資料幀 [col2 和 col3 的值應由 ; 相應地]
| col1 | col2 | col3 |
|---|---|---|
| 1 | 12 | 澳大利亞 |
| 1 | 34 | SL |
| 1 | 56 | 新西蘭 |
| 2 | 31 | 工業 |
| 2 | 54 | 我們 |
| 2 | 81 | 英國 |
| 3 | 空值 | 禁止 |
| 4 | 內德 | 空值 |
uj5u.com熱心網友回復:
您可以使用 pyspark 函式split()將具有多個值的列轉換為陣列,然后使用該函式explode()從不同的值中生成多行。
它可能看起來像這樣:
df = df.withColumn("<columnName>", explode(split(df.<columnName>, ";")))
如果要保留 NULL 值,可以使用explode_outer().
如果您希望多個展開陣列的值在行中匹配,您可以使用posexplode()然后filter()到位置對應的行。
uj5u.com熱心網友回復:
下面的代碼作業得很好
data = [(1,'12;34;56', 'Aus;SL;NZ'),
(2,'31;54;81', 'Ind;US;UK'),
(3,None, 'Ban'),
(4,'Ned', None) ]
columns = ['Id', 'Score','Countries']
df = spark.createDataFrame(data, columns)
#df.show()
df2=df.select("*",posexplode_outer(split("Countries",";")).alias("pos1","value1"))
#df2.show()
df3=df2.select("*",posexplode_outer(split("Score",";")).alias("pos2","value2"))
#df3.show()
df4=df3.filter((df3.pos1==df3.pos2) | (df3.pos1.isNull() | df3.pos2.isNull()))
df4=df4.select("Id","value2","value1")
df4.show() #Final Output
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/477868.html
標籤:阿帕奇火花 pyspark apache-spark-sql 天蓝色数据块
