【分散処理】PySpark ~ DataFrame / show() ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/01/04/150942
https://dk521123.hatenablog.com/entry/2020/05/18/154829
https://dk521123.hatenablog.com/entry/2020/07/02/000000

の続き。

調査する際に PySpark の DataFrame の show()などを使うのだが
その際に、結構、忘れてしまうので、ここでメモっておく。

目次

【0】API仕様
【1】項目を絞って表示させたい場合
【2】条件を絞って表示させたい場合
【3】値を省略させずに表示させたい場合
【4】表示行数を増やしたい場合
【5】ソート順に並べて表示する
【6】レコードを縦に表示したい場合
【7】RDDに対してデバッグログ表示したい場合

【0】API仕様

* 以下を参照

https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.DataFrame.show.html

DataFrame.show(n=20, truncate=True, vertical=False)

サンプル

from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType

spark_context = SparkContext()
spark = SparkSession(spark_context)

rdd = spark_context.parallelize([
  ('x0001', 'Mike', 'Sales'),
  ('x0002', 'Tom', 'IT'),
  ('x0003', 'Sam', 'Sales'),
  ('x0004', 'Kevin', 'Human resources'),
  ('x0005', 'Bob', 'IT'),
  ('x0006', 'Alice', 'Banking'),
  ('x0007', 'Carol', 'IT'),
])
schema = StructType([
  StructField('id', StringType(), False),
  StructField('name', StringType(), False),
  StructField('job', StringType(), False),
])

data_frame = spark.createDataFrame(rdd, schema)

# 表示
data_frame.show(n=5, truncate=False, vertical=True)

出力結果

-RECORD 0---------------
 id   | x0001
 name | Mike
 job  | Sales
-RECORD 1---------------
 id   | x0002
 name | Tom
 job  | IT
-RECORD 2---------------
 id   | x0003
 name | Sam
 job  | Sales
-RECORD 3---------------
 id   | x0004
 name | Kevin
 job  | Human resources
-RECORD 4---------------
 id   | x0005
 name | Bob
 job  | IT
only showing top 5 rows

【1】項目を絞って表示させたい場合

* select() + show() を使う

サンプル

# 項目を絞って表示
data_frame.select("name").show()

# 複数で絞りたい場合
data_frame.select("id", "name").show()

【2】条件を絞って表示させたい場合

* filter() + show() を使う

サンプル

# WHERE的に条件で絞る
data_frame.filter(data_frame["name"] == "Mike").show()

【3】値を省略させずに表示させたい場合

* デフォルト表示の場合、日時や長い文字列を表示した場合、
 「...」になるので、その表示方法を記す

+--------------------+
|                 col|
+--------------------+
|2015-11-16 07:15:...|
+--------------------+

サンプル

# cf. truncate = 切り捨てる
data_frame.show(truncate=False)

【4】表示行数を増やしたい場合

サンプル

# デフォルト 20行 の表示を 30行 に増やしたい場合
data_frame.show(n=30)
# data_frame.show(30)

【5】ソート順に並べて表示する

* 必ずしもID順に表示される訳ではないので確認時に大変

解決案

* OrderBy を使う。(e.g. data_frame.orderBy(col('id').desc()).show())
 ⇒ サンプルなどは、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2020/01/04/150942

参考文献
http://sinhrks.hatenablog.com/entry/2015/04/29/085353

【6】レコードを縦に表示したい場合

* おまけとして、verticalについて書いておく
 => vertical=True でレコードを縦に表示する

サンプル

data_frame.show(vertical=True)

【7】RDDに対してデバッグログ表示したい場合

おまけ的に。。。
以下に記載されているものを参考に。

https://stackoverflow.com/questions/25295277/view-rdd-contents-in-python-spark
サンプル

# n : 表示させたいインデックス(1とか2とか)
print(rdd.take(n))

# あくまで、障害時のデバッグログとして(通常のログには使わないこと!)
print(rdd.collect())

# collect() に関する弊害は、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2021/04/22/131849

参考文献

https://dev.classmethod.jp/articles/prevent-long-values-from-being-omitted-in-the-show-method-of-spark-dataframe/

関連記事

PySpark ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2019/11/14/221126
PySpark ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/04/03/004254
PySpark ~ DataFrame / データ操作編 ~
https://dk521123.hatenablog.com/entry/2020/01/04/150942
PySpark ~ DataFrame / テーブル・項目操作編 ~
https://dk521123.hatenablog.com/entry/2020/05/18/154829
PySpark ~ DataFrame / 項目数を取得するには ~
https://dk521123.hatenablog.com/entry/2020/08/28/183706
PySpark ~ PySpark経由でDBに接続する ~
https://dk521123.hatenablog.com/entry/2020/07/02/000000
PySpark ~ CSV / Read/Writeのプロパティ ~
https://dk521123.hatenablog.com/entry/2020/07/30/195226
PySpark ~ CSV / escape 編 ~
https://dk521123.hatenablog.com/entry/2020/11/23/224349
PySpark ~ エスケープされた区切り文字が含んだデータを扱う ~
https://dk521123.hatenablog.com/entry/2020/07/09/000832
AWS Glue ~ DynamicFrame ~
https://dk521123.hatenablog.com/entry/2021/12/14/221043