我有這個 pyspark 資料框
df = spark.createDataFrame([("a", "b", "v1", 1234, 56, 78, 9), ("a", "b", "v2", 987, 6, 543, 21), ("c", "d", "v1", 12, 345, 6, 789), ("c", "d", "v2", 9, 876, 5, 4321)], ("k1", "k2", "k3", "ca", "pa", "cb", "pb"))
df.show()
--- --- --- ---- --- --- ----
| k1| k2| k3| ca| pa| cb| pb|
--- --- --- ---- --- --- ----
| a| b| v1|1234| 56| 78| 9|
| a| b| v2| 987| 6|543| 21|
| c| d| v1| 12|345| 6| 789|
| c| d| v2| 9|876| 5|4321|
--- --- --- ---- --- --- ----
基本上我想要做的是通過對前兩個鍵進行分組來轉換此資料框k1,k2并使用第三個鍵k3作為字典的主鍵,該字典將包含其他列 ( ca, pa, cb, pb)的值,并將包含在一個新列。這種轉換將導致資料框看起來完全像這樣:
--- --- --------------------------------------------------------------------------------------------------
|k1 |k2 |k3 |
--- --- --------------------------------------------------------------------------------------------------
|c |d |{"v1": {"pa": 345, "pb": 789, "ca": 12, "cb": 6}, "v2": {"pa": 876, "pb": 4321, "ca": 9, "cb": 5}}|
|a |b |{"v1": {"pa": 56, "pb": 9, "ca": 1234, "cb": 78}, "v2": {"pa": 6, "pb": 21, "ca": 987, "cb": 543}}|
--- --- --------------------------------------------------------------------------------------------------
為此,我撰寫了以下代碼,但我認為可以改進此代碼(使用 pandas_udf 或其他東西),但我沒有找到更好的解決方案,我正在尋找任何可能導致更優雅的建議/指導一個有效的解決方案。
def reoganize_col(list_json):
col_data = {}
for d in list_json:
print(d)
for k,v in d.items():
col_data[k] = v
return json.dumps(col_data)
udf_reoganize_col = F.udf(reoganize_col, T.StringType())
df = df.withColumn('x', F.create_map(F.lit('ca'), F.col('ca'),
F.lit('cb'), F.col('cb'),
F.lit('pa'), F.col('pa'),
F.lit('pb'), F.col('pb')))
.groupby(['k1', 'k2']).agg(F.collect_list(F.create_map(F.col('k3'), F.col('x'))).alias('k3'))
df = df.withColumn('k3', udf_reoganize_col(F.col('k3')))
uj5u.com熱心網友回復:
您的解決方案幾乎就在那里。我建議您使用to_json而不是 UDF 來提高性能,并使用struct而不是map使代碼更清晰。
(df
.groupBy('k1', 'k2')
.agg(F.collect_list(F.struct('k3', F.struct('pa', 'pb', 'ca', 'cb'))).alias('k3'))
.withColumn('k3', F.to_json(F.map_from_entries('k3')))
.show(10, False)
)
# Output
# --- --- ---------------------------------------------------------------------------------
# |k1 |k2 |k3 |
# --- --- ---------------------------------------------------------------------------------
# |c |d |{"v1":{"pa":345,"pb":789,"ca":12,"cb":6},"v2":{"pa":876,"pb":4321,"ca":9,"cb":5}}|
# |a |b |{"v1":{"pa":56,"pb":9,"ca":1234,"cb":78},"v2":{"pa":6,"pb":21,"ca":987,"cb":543}}|
# --- --- ---------------------------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333468.html
下一篇:如果任一變數包含字符,則過濾
