2 回答

TA貢獻1851條經驗 獲得超5個贊
您可以通過將簡單引號替換為雙引號來首先轉換為 JSON 字符串,然后使用 from_json將其轉換為結構列或映射列。
如果您知道該詞典的模式,則可以按如下方式操作:
data = [
(1, 2, "{'c': 1, 'd': 2}"),
(3, 4, "{'c': 7, 'd': 0}"),
(5, 6, "{'c': 5, 'd': 4}")
]
df = spark.createDataFrame(data, ["a", "b", "dic"])
schema = StructType([
StructField("c", StringType(), True),
StructField("d", StringType(), True)
])
df = df.withColumn("dic", from_json(regexp_replace(col("dic"), "'", "\""), schema))
df.select("a", "b", "dic.*").show(truncate=False)
#+---+---+---+---+
#|a |b |c |d |
#+---+---+---+---+
#|1 |2 |1 |2 |
#|3 |4 |7 |0 |
#|5 |6 |5 |4 |
#+---+---+---+---+
如果您不知道所有鍵,則可以將其轉換為映射而不是結構,然后將其分解并透視以獲取列形式的鍵:
df = df.withColumn("dic", from_json(regexp_replace(col("dic"), "'", "\""), MapType(StringType(), StringType())))\
.select("a", "b", explode("dic"))\
.groupBy("a", "b")\
.pivot("key")\
.agg(first("value"))

TA貢獻1712條經驗 獲得超3個贊
嘗試:
#to convert pyspark df into pandas:
df=df.toPandas()
df["d"]=df["dic"].str.get("d")
df["e"]=df["dic"].str.get("e")
df=df.drop(columns=["dic"])
返回:
a b d e
0 1 2 1 2
1 3 4 7 0
2 5 6 5 4
添加回答
舉報