Select Expr in Spark Dataframe | Analyticshutの翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
SelectとExprは、Sparkデータフレームで最も使用される関数の一つです。本ブログでは、selectとexpr関数を用いて行えるさまざまなことを学びます。
データフレームからカラムを選択する
これはデータフレームに対して最も使用される機能の一つであり、これを行うためにはexpr
とSelectを使用します。expr
関数を使う前に、インポートする必要があります。
df_csv = spark.read.format("csv") \
.option("inferSchema", "true") \
.option("header","true") \
.load("data/flights.csv")
# selecting columns
from pyspark.sql.functions import expr
df_csv.select(expr("count")).show(2)
カラムデータに対するオペレーション
より面白いexpr
のユースケースは、カラムデータに対してさまざまなオペレーションを実行するというものです。これによって、カラムの長さを取得したり、データを抽出したり、その他SQLでできるすべてのことが可能となります。
df_csv.select(expr("count"), expr("count > 10")).show(2)
+-----+------------+
|count|(count > 10)|
+-----+------------+
| 15| true|
| 1| false|
+-----+------------+
上のコードでは、カラムのフィールドが10より大きいか否かを表示しています。このカラム名はユーザーフレンドリーではないことが分かるかと思います。SQLと同じように、使いやすいカラム名を指定します。
df_csv.select(expr("count"), expr("count > 10 as if_greater_than_10")).show(2)
Exprによるエイリアスの使用
カラムにユーザーフレンドリーな名前を指定するためにAlias
関数を使用します。
df_csv.select(expr("count"), expr("count > 10").alias("if_greater_than_10")).show(2)
Exprを用いた全カラムの選択
データフレームからの他のカラムと、新たに作成した表現式のカラムを選択する必要があるかもしれません。これは非常に簡単です。カンマ区切りのカラムのリストや、データフレームの全てのカラムをリストするために*
を使用することができます。
df_csv.select("*", expr("count > 10").alias("if_greater_than_10")).show(2)
ExprとAliasによるカラムの名称変更
データフレームのカラムの名前を変更するためにExprを使用することができます。これは実際にはカラムの名称を変更するのではなく、新たなカラムを作成します。
df_csv.select("*", expr("DEST_COUNTRY_NAME").alias("dest")).show(2)
+-----------------+-------------------+-----+-------------+
|DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count| dest|
+-----------------+-------------------+-----+-------------+
| United States| Romania| 15|United States|
| United States| Croatia| 1|United States|
+-----------------+-------------------+-----+-------------+
SelectExpr - selectとexprのショートカット
SelectとExprは、Sparkデータフレームを操作する際に広く使用されており、Sparkチームは簡単にそれらを利用できるようにしています。selectExpr
関数を使うことができます。
df_csv.selectExpr("count", "count > 10 as if_greater_than_10").show(2)
df_csv.selectExpr("*", "DEST_COUNTRY_NAME as dest").show(2)
これが有用であれば幸いです。次に記事でお会いしましょう。