0
0

Spark の Dataframe を1レコードのみ Python の辞書型変数に変換する際の注意事項

Last updated at Posted at 2024-02-26

概要

SparkのDataframeをPythonの辞書型変数に変換する際、最初の1レコードのみを対象とする場合があります。このとき、Dataframeが空である可能性を考慮することが重要です。以下に、collectメソッドの出力結果の最初のインデックスの値を取得し、asDictメソッドで変換するプログラムを示します。

data = [
    ("Alice", 25),
]
df = spark.createDataFrame(data, ["Name", "Age"])

df_data = df.collect()
df_data[0].asDict()

image.png

Dataframeが空の場合、以下のようなエラーが発生します。これは、collectメソッドの出力結果がリスト型変数であり、存在しないインデックスを指定したためです。

# 空のDataframeを作成
empty_df = df.filter("1=0")
empty_df_data = empty_df.collect()

empty_df_data[0].asDict()
IndexError: list index out of range

image.png

通常、このようなコードを記述することは少ないですが、備忘録としてその対応方法を本記事にまとめておきます。

コードと実行結果

事前準備

data = [
    ("Alice", 25),
]
df = spark.createDataFrame(data, ["Name", "Age"])

image.png

基本的な動作確認

df_data = df.collect()
df_data[0].asDict()
{'Name': 'Alice', 'Age': 25}

image.png

エラーケースのコードを実行

以下のコードを実行すると、empty_df_data[0].asDict()の部分でエラーが発生します。これは、empty_df_dataが空のリストであり、empty_df_data[0]が存在しないためです。

# 空のDataframeを作成
empty_df = df.filter("1=0")
empty_df_data = empty_df.collect()
empty_df_data[0].asDict()
IndexError: list index out of range

image.png

データフレームが空であることを考慮した改善

以下のコードでは、empty_df.limit(1).count() > 0によりDataframeが空でないことを確認しています。Dataframeが空であれば、"empty_df_data is empty"と表示され、エラーは発生しません。

empty_df = df.filter("1=0")
if empty_df.limit(1).count() > 0:
    empty_df_data = empty_df.collect()
    empty_df_data[0].asDict()
else:
    print("empty_df_data is empty")

image.png

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