2024/4/12に翔泳社よりApache Spark徹底入門を出版します!
書籍のサンプルノートブックをウォークスルーしていきます。Python/Chapter03/3-1 Example 3.7
となります。
翻訳ノートブックのリポジトリはこちら。
ノートブックはこちら
from pyspark.sql.types import *
from pyspark.sql.functions import col, expr, when, concat, lit
# データのスキーマを定義
""""
schema = (StructType([
StructField("Id", IntegerType(), False),
StructField("First", StringType(), False),
StructField("Last", StringType(), False),
StructField("Url", StringType(), False),
StructField("Published", StringType(), False),
StructField("Hits", IntegerType(), False),
StructField("Campaigns", ArrayType(StringType()), False)]))
"""
# DDL(Data Definition Language)によるスキーマ定義
ddl_schema = "`Id` INT,`First` STRING,`Last` STRING,`Url` STRING,`Published` STRING,`Hits` INT,`Campaigns` ARRAY<STRING>"
# データの作成
data = [[1, "Jules", "Damji", "https://tinyurl.1", "1/4/2016", 4535, ["twitter", "LinkedIn"]],
[2, "Brooke","Wenig","https://tinyurl.2", "5/5/2018", 8908, ["twitter", "LinkedIn"]],
[3, "Denny", "Lee", "https://tinyurl.3","6/7/2019",7659, ["web", "twitter", "FB", "LinkedIn"]],
[4, "Tathagata", "Das","https://tinyurl.4", "5/12/2018", 10568, ["twitter", "FB"]],
[5, "Matei","Zaharia", "https://tinyurl.5", "5/14/2014", 40578, ["web", "twitter", "FB", "LinkedIn"]],
[6, "Reynold", "Xin", "https://tinyurl.6", "3/2/2015", 25568, ["twitter", "LinkedIn"]]
]
# 上で定義したDDLスキーマを用いてデータフレームを作成
blogs_df = spark.createDataFrame(data, ddl_schema)
# データフレームの表示。上のテーブルを反映しているはずです
blogs_df.show()
+---+---------+-------+-----------------+---------+-----+--------------------+
| Id| First| Last| Url|Published| Hits| Campaigns|
+---+---------+-------+-----------------+---------+-----+--------------------+
| 1| Jules| Damji|https://tinyurl.1| 1/4/2016| 4535| [twitter, LinkedIn]|
| 2| Brooke| Wenig|https://tinyurl.2| 5/5/2018| 8908| [twitter, LinkedIn]|
| 3| Denny| Lee|https://tinyurl.3| 6/7/2019| 7659|[web, twitter, FB...|
| 4|Tathagata| Das|https://tinyurl.4|5/12/2018|10568| [twitter, FB]|
| 5| Matei|Zaharia|https://tinyurl.5|5/14/2014|40578|[web, twitter, FB...|
| 6| Reynold| Xin|https://tinyurl.6| 3/2/2015|25568| [twitter, LinkedIn]|
+---+---------+-------+-----------------+---------+-----+--------------------+
# データフレームから一時ビューの作成
blogs_df.createOrReplaceTempView("blogs")
%scala
// 一時ビューから読み込んでDDL形式でスキーマを表示
spark.table("blogs").schema.toDDL
res0: String = Id INT,First STRING,Last STRING,Url STRING,Published STRING,Hits INT,Campaigns ARRAY<STRING>
# Hitsの値を2倍にして2行を表示
blogs_df.select(expr("Hits") * 2).show(2)
+----------+
|(Hits * 2)|
+----------+
| 9070|
| 17816|
+----------+
only showing top 2 rows
# HitsとIdを加算して表示
blogs_df.select(expr("Hits") + expr("Id")).show(truncate=False)
+-----------+
|(Hits + Id)|
+-----------+
|4536 |
|8910 |
|7662 |
|10572 |
|40583 |
|25574 |
+-----------+
# Hitsが10000を越えるかどうかを示す列Big Hittersを追加して表示
blogs_df.withColumn("Big Hitters", (expr("Hits") > 10000)).show()
+---+---------+-------+-----------------+---------+-----+--------------------+-----------+
| Id| First| Last| Url|Published| Hits| Campaigns|Big Hitters|
+---+---------+-------+-----------------+---------+-----+--------------------+-----------+
| 1| Jules| Damji|https://tinyurl.1| 1/4/2016| 4535| [twitter, LinkedIn]| false|
| 2| Brooke| Wenig|https://tinyurl.2| 5/5/2018| 8908| [twitter, LinkedIn]| false|
| 3| Denny| Lee|https://tinyurl.3| 6/7/2019| 7659|[web, twitter, FB...| false|
| 4|Tathagata| Das|https://tinyurl.4|5/12/2018|10568| [twitter, FB]| true|
| 5| Matei|Zaharia|https://tinyurl.5|5/14/2014|40578|[web, twitter, FB...| true|
| 6| Reynold| Xin|https://tinyurl.6| 3/2/2015|25568| [twitter, LinkedIn]| true|
+---+---------+-------+-----------------+---------+-----+--------------------+-----------+
# First、Last、Id列を文字列結合しAuthorsId列を作成、AuthorsId列のみを4行分表示
blogs_df.withColumn(
"AuthorsId", (concat(expr("First"), expr("Last"), expr("Id")))
).select(expr("AuthorsId")).show(n=4)
+-------------+
| AuthorsId|
+-------------+
| JulesDamji1|
| BrookeWenig2|
| DennyLee3|
|TathagataDas4|
+-------------+
only showing top 4 rows