我想修改/過濾結構內的屬性。假設我有一個包含以下列的資料框:
# ------------------------------------------
#| arrayCol |
# ------------------------------------------
#| {"a" : "some_value", "b" : [1, 2, 3]} |
# ------------------------------------------
架構:
struct<a:string, b:array<int>>
當陣列中有值時,我想過濾掉 'b' 屬性中的一些值 == 1
所需的結果如下:
# ------------------------------------------
#| arrayCol |
# ------------------------------------------
#| {"a" : "some_value", "b" : [2, 3]} |
# ------------------------------------------
是否可以在不提取屬性、過濾值并重新構建另一個結構的情況下執行此操作?
uj5u.com熱心網友回復:
一種方法是定義一個 UDF:
例子:
import ast
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyspark.sql.types import StringType, MapType
def remove_value(col):
col["b"] = str([x for x in ast.literal_eval(col["b"]) if x != 1])
return col
if __name__ == "__main__":
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(
[
{
"arrayCol": {
"a": "some_value",
"b": "[1, 2, 3]",
},
},
]
)
remove_value_udf = spark.udf.register(
"remove_value_udf", remove_value, MapType(StringType(), StringType())
)
df = df.withColumn(
"result",
remove_value_udf(F.col("arrayCol")),
)
結果:
root
|-- arrayCol: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
|-- result: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
--------------------------------- ------------------------------
|arrayCol |result |
--------------------------------- ------------------------------
|{a -> some_value, b -> [1, 2, 3]}|{a -> some_value, b -> [2, 3]}|
--------------------------------- ------------------------------
uj5u.com熱心網友回復:
AFAIK,Spark 不支持在嵌套結構中添加/更新欄位。要更新結構列,您需要使用現有欄位和更新的欄位創建新結構。
在您的情況下,您可以通過使用filter函式來過濾b欄位來更新結構列,如下所示:
import pyspark.sql.functions as F
df1 = df.withColumn(
"arrayCol",
F.struct(
F.col("arrayCol.a").alias("a"),
F.expr("filter(arrayCol.b, x -> x != 1)").alias("b")
)
)
df1.show()
# --------------------
#| arrayCol|
# --------------------
#|{some_value, [2, 3]}|
# --------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360771.html
下一篇:Spark未完全讀取AVRO檔案
