0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【トリビアのDelta Lake】#7 Pysparkでカラム内のjsonデータを取り出す

Posted at

Sparkはさまざまなフォーマットのデータに対応しており、jsonデータも勿論readし、Databframeにすることができます。

{"a": 123,"b":"hello"},
{"a": 789,"b":"world"}

こんなjsonファイルがあったとして、こんな感じで読める。

read_json.py
df_from_json = (
    spark
    .read
    .format("json")
    .load("<file_name>.json")
)

値の中身にjsonがある場合

ここまでは「そりゃそうじゃん」って内容なのですが、じゃあ、カラム内の値がjsonだとしたら?

+---+------------------------------+
|no |value                         |
+---+------------------------------+
|1  |{"year": 2021,"rank":"junior"}|
|2  |{"year": 2022,"rank":"senior"}|
+---+------------------------------+

get_json_object

sparkは優秀なので、おあつらえむきなfunctionがあります。

こんな感じで書けます。

get_json_in_dataframe.py
from pyspark.sql.functions import get_json_object,col
df_get_json = (
    df_include_json
    .withColumn("year", get_json_object(col("value"), "$.year").cast("string"))
    .withColumn("rank", get_json_object(col("value"), "$.rank").cast("string"))
)
df_get_json.show()

>>>
+---+------------------------------+----+------+
|no |value                         |year|rank  |
+---+------------------------------+----+------+
|1  |{"year": 2021,"rank":"junior"}|2021|junior|
|2  |{"year": 2022,"rank":"senior"}|2022|senior|
+---+------------------------------+----+------+

もちろん、select文を使うことで、value列を消して、見たい値だけ残すってことも可能です。

get_json_with_select.py
from pyspark.sql.functions import get_json_object,col
df_get_json = (
    df_include_json
    .withColumn("year", get_json_object(col("value"), "$.year").cast("string"))
    .withColumn("rank", get_json_object(col("value"), "$.rank").cast("string"))
    .select(
        "no",
        "year",
        "rank"
    )
)
df_get_json.show()
>>>
+---+----+------+
|no |year|rank  |
+---+----+------+
|1  |2021|junior|
|2  |2022|senior|
+---+----+------+

これで美しくなりましたね。

どんなときに使う?

APIのGetメソッドを使って返ってきたレスポンス(json)は、とあるvalueの中身がまたjsonで…など、多階層にネストされていることもしばしば。
そんなときも根気よく掘って値を表示していきたい、っていうときに使えそうですね。

久しぶりにQiitaを書きました。
今後ともよろしくお願いします。

このシリーズの目的

クラウドストレージに蓄積された生データ(CSV,JSON等)を加工するのに必要なPysparkの知識を溜めていく、まさにPysparkに関するトリビアのDalta Lakeを目指しています。
Pysparkに関する記事はまだ海外のものが多く、このシリーズが私のような国内の駆け出しデータエンジニアの一助になることを願っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?