やましなぶろぐ

pyspark入門として独学を進める

データサイエンス100本ノック(構造化データ加工編)をpysparkで解いてみる

「データサイエンティスト協会スキル定義委員」の「データサイエンス100本ノック(構造化データ加工編)」を利用しています

🕒 Last mod: 2021-01-11


1. pysparkの独学を進めたい

pysparkに興味を持ったので独学を進めたいと思います。

Pandasなど別のデータ加工処理とは文法が全く異なるので最初のうちはpysparkを使いこなせません。

sparkによるデータ加工になれることも目的としています。

2. この記事で使用するデータで演習問題

「データサイエンティスト協会スキル定義委員」の「データサイエンス100本ノック(構造化データ加工編)」を利用しています

上記に含まれるデータ(CSVファイル)と演習問題を利用させていただきます。

3. 事前準備その1; SparkSession Create

ipython上でpysparkを使用するためのおまじないです。

import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

4. 事前準備その2; Read Csv

最初のうちはなれないのでCSVファイルを読み込むのも一苦労です。

pyspark.sql.DataFrameとして読み込みます。Pandas.DataFrameとは全くの別物です。

receipt = spark.read.option(
    "header",
    True,
).csv(
    '100dscsv/receipt.csv'
)

5. P-001: レシート明細のデータフレーム(df_receipt)から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。

receipt.show(10)

5.1. headではなくshow?

pyspark.sql.DataFrame.headではRow形式での出力となります。

output head
[Row(sales_ymd='20181103', sales_epoch='1541203200', store_cd='S14006', receipt_no='112', receipt_sub_no='1', customer_id='CS006214000001', product_cd='P070305012', quantity='1', amount='158'),
 Row(sales_ymd='20181118', sales_epoch='1542499200', store_cd='S13008', receipt_no='1132', receipt_sub_no='2', customer_id='CS008415000097', product_cd='P070701017', quantity='1', amount='81'),
  Row(sales_ymd='20170712', sales_epoch='1499817600', store_cd='S14028', receipt_no='1102', receipt_sub_no='1', customer_id='CS028414000014', product_cd='P060101005', quantity='1', amount='170')]

ちなみにshowの場合のアウトプット。

output show
+---------+-----------+--------+----------+--------------+--------------+----------+--------+------+
|sales_ymd|sales_epoch|store_cd|receipt_no|receipt_sub_no|   customer_id|product_cd|quantity|amount|
+---------+-----------+--------+----------+--------------+--------------+----------+--------+------+
| 20181103| 1541203200|  S14006|       112|             1|CS006214000001|P070305012|       1|   158|
| 20181118| 1542499200|  S13008|      1132|             2|CS008415000097|P070701017|       1|    81|
| 20170712| 1499817600|  S14028|      1102|             1|CS028414000014|P060101005|       1|   170|
+---------+-----------+--------+----------+--------------+--------------+----------+--------+------+
only showing top 3 rows

出力形式は好みかもしれませんが、Showのほうが結果を見やすいような気がします。