簡體   English   中英

將嵌套的 JSON 列轉換為 Pyspark DataFrame 列

[英]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 來自哪里? 您可以使用posexplodeevent_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM