iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
AI & Data

30天胡搞瞎搞學會pyspark系列 第 13

[ Day 13 ] - Pyspark | 清理 - 特殊資料型態篇 - Struct : json

  • 分享至 

  • xImage
  •  

為什麼會有這樣的資料結構出現:

通常都是在讀Json格式的資料時

遇到這種巢狀(nested)結構時,要怎麼處理呢?

會利用. 或是explode()去展開所有資料

取資料的方式:

遇到多階層,巢狀,複雜的json格式,要怎麼轉換成row-based 的架構

方法一:暴力解-可以直接將階層全部攤平成同一個layer,但是會導致資料不斷的duplicate的問題

方法二:利用pyspark提供的各種function進行資料的拆解get_json_object()

data = [("1", '''{"f1": "value1", "f2": "value2"}'''), ("2", '''{"f1": "value12"}''')]
df = spark.createDataFrame(data, ("key", "jstring"))
df.show(truncate=False)
df.select(df.key, get_json_object(df.jstring, '$.f1').alias("c0"), \
                  get_json_object(df.jstring, '$.f2').alias("c1") ).show()
                  
'''
+---------+---+------------+Original Data+---------+---+------------+
df.show(truncate=False)
+---+--------------------------------+
|key|jstring                         |
+---+--------------------------------+
|1  |{"f1": "value1", "f2": "value2"}|
|2  |{"f1": "value12"}               |
+---+--------------------------------+
+---------+---+------------+Original Data+---------+---+------------+

+---------+---+------------+OUTPUT+---------+---+------------+
df.select(df.key, get_json_object(df.jstring, '$.f1').alias("c0"), \
                  get_json_object(df.jstring, '$.f2').alias("c1") ).show()
+---+-------+------+
|key|     c0|    c1|
+---+-------+------+
|  1| value1|value2|
|  2|value12|  null|
+---+-------+------+
+---------+---+------------+OUTPUT+---------+---+------------+
'''

■ 結語

善用StructType()處理Json格式,你會看到新世界,搭配參數的設定,便能輕鬆完成資料處理!

如果有任何不理解、錯誤或其他方法想分享的話,歡迎留言給我!喜歡的話,也歡迎按讚訂閱!

我是 Vivi,一位在雲端掙扎的資料工程師!我們下一篇文章見!Bye Bye~


上一篇
[ Day 12 ] - Pyspark | 清理 - 特殊資料型態篇 - Array : explode()
下一篇
[ Day 14 ] - Pyspark | 清理 - 特殊資料型態篇 - MapType :
系列文
30天胡搞瞎搞學會pyspark30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言