|-- x: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- y: struct (nullable = true)
| | |-- z: struct (nullable = true)
| | | |-- aa: string (nullable = true)
我有上面的嵌套模式,我想將列 z 從結構更改為字串。
|-- x: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- y: struct (nullable = true)
| | |-- z: string (nullable = true)
我使用的不是 Spark 3,而是 Spark 2.4.x。會更喜歡 Scala 方式,但 python 也可以作業,因為這是一次性手動回填一些過去資料的事情。
有沒有辦法用一些 udf 或任何其他方式來做到這一點?
我知道通過 to_json 很容易做到這一點,但是嵌套的結構陣列會導致問題。
uj5u.com熱心網友回復:
轉換為高階函式
df3=df.withColumn('x', expr('transform(x, s-> struct(s.y as y,cast(to_json(s.z) as string) as z))')).printSchema()
root
|-- x: array (nullable = true)
| |-- element: struct (containsNull = false)
| | |-- y: struct (nullable = true)
| | |-- z: string (nullable = true)
uj5u.com熱心網友回復:
對于您的特定情況,您可以使用 Spark 2.4 或 Spark 3.0 上的內置函式
火花 2.4
您可以arrays_zip按如下方式使用:
- 首先,為每個要作為陣列結構元素的欄位創建陣列
- 第二,你
arrays_zip用來壓縮那些欄位
這是完整的代碼,帶有df您的輸入資料框:
import org.apache.spark.functions.{arrays_zip, col}
df.withColumn("x",
arrays_zip(
col("x").getField("y").alias("y"),
col("x").getField("z").getField("aa").alias("z")
))
火花3.0
您可以使用transform重建陣列的元素結構,如下所示:
df.withColumn("x", transform(
col("x"),
element => struct(
element.getField("y").alias("y"),
element.getField("z").getField("aa").alias("z")
)
))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/467642.html
標籤:斯卡拉 阿帕奇火花 pyspark apache-spark-sql
上一篇:Scala3:派生型別類以在案例類和元組型別之間進行轉換
下一篇:將類名作為字串引數傳遞以創建實體
