ドット記法のウィンドウ関数をSQLに変換する
各行に「次の停車駅に到着するまでの分数」を持たせる列を、列車の時刻表に追加します。
df.columns == ['train_id', 'station', 'time']のデータフレームdfがあります。dfはscheduleという名前のSQLテーブルとして登録されています。- 次のウィンドウ関数クエリはドット記法を使っています。新しいデータフレーム
dot_dfを返します。
window = Window.partitionBy('train_id').orderBy('time')
dot_df = df.withColumn('diff_min',
(unix_timestamp(lead('time', 1).over(window),'H:m')
- unix_timestamp('time', 'H:m'))/60)
unix_timestamp 関数は、SQLの UNIX_TIMESTAMP 関数と同等である点に注意してください。
サンプルコードのスキャフォールディングに注意してください。スキャフォールディング(プレースホルダーのアンダースコア _____)に合わせて解答を整形すると、書式上の問題による誤った不正解判定を防げます。
この演習はコースの一部です
Pythonで学ぶ Spark SQL 入門
演習の手順
dot_dfと同一の結果を得るSQLクエリを作成してください。クエリはスキャフォールディング(プレースホルダーのアンダースコア_____)に従って整形してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Create a SQL query to obtain an identical result to dot_df
query = """
SELECT *,
(____(____(time, 1) ____ (____ BY train_id ____ BY time),'H:m')
- ____(time, 'H:m'))/60 AS diff_min
FROM schedule
"""
sql_df = spark.sql(query)
sql_df.show()