[英]parsing a JSON string Pyspark dataframe column that has string of array in one of the columns
[英]Converted a nested JSON column to Pyspark DataFrame Columns
我已經使用 pyspark.pandas 數據幀在 S3 中讀取並存儲了鑲木地板文件。 現在在第二階段,我正在嘗試讀取數據塊中 pyspark 數據框中的鑲木地板文件,並且我面臨將嵌套 json 列轉換為正確列的問題。 首先,我使用以下命令從 S3 讀取鑲木地板數據:
adf = spark.read.parquet('s3://path')
我的 pyspark 數據框中的示例嵌套列如下所示:
event_params:array
element:struct
key:string
value:struct
double_value:double
float_value:integer
int_value:long
string_value:string
pyspark 數據框列中的示例數據:
0: {"key": "ignore_referrer", "value": {"double_value": null, "float_value": null, "int_value": null, "string_value": "true"}}
1: {"key": "session_engaged", "value": {"double_value": null, "float_value": null, "int_value": null, "string_value": "1"}}
2: {"key": "engagement_time_msec", "value": {"double_value": null, "float_value": null, "int_value": 123, "string_value": null}}
3: {"key": "value", "value": {"double_value": null, "float_value": null, "int_value": 23, "string_value": null}}
4: {"key": "page_location", "value": {"double_value": null, "float_value": null, "int_value": null, "string_value": "https://abc/0.0.23-manual/index.html"}}
我正在嘗試為 json 中存在的所有字段創建新列,因此例如我正在尋找的結果是這樣的:
key session_engaged value
1 12 true
我嘗試的一種方法是使用 spark.sql,但我收到了諸如 Dataframe has no object'_get_object_id' 之類的錯誤:
bdf = adf.createOrReplaceTempView(adf)
df = spark.sql('''
SELECT
event_timestamp,
event_name,
event_params :element:value
FROM bdf;''')
錯誤:
AttributeError: 'DataFrame' object has no attribute '_get_object_id'
我已經嘗試使用 spark.SQL 來執行此操作,並且我還探索了explode 函數,但是這些列對於每一行都是不同的,我只想將所有這些 json 嵌套結構轉換為列。 如果有人可以使用任何非常有幫助的工作方法為我指明正確的方向!
我不太確定預期的輸出,12 來自哪里? 您可以使用posexplode
將event_params
中的每個元素放在一行中,並將位置作為它自己的列。
然后您可以使用.select("*", col("col.value.*"))
訪問所有 json 字段,此命令會將 json 字段添加到 df。
完整代碼:
from pyspark.sql.functions import posexplode, col
df \
.select(posexplode("event_params")) \
.select("*", col("col.key") , col("col.value.*")) \
.show(truncate=False)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.