Spark DataFrameのshow()メソッドで長い値が省略されないようにする
こんにちは、CX事業本部の若槻です。
Apache Sparkは、大規模なデータを処理するための統合分析エンジンです。
今回は、SparkのDataFrameをshow()
メソッドでコンソール表示する際に、長い値が省略されないようにする方法を確認してみました。
環境
% pyspark --version WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/usr/local/Cellar/apache-spark/3.0.1/libexec/jars/spark-unsafe_2.12-3.0.1.jar) to constructor java.nio.DirectByteBuffer(long,int) WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 3.0.1 /_/ Using Scala version 2.12.10, OpenJDK 64-Bit Server VM, 11.0.9 Branch HEAD Compiled by user ubuntu on 2020-08-28T08:58:35Z Revision 2b147c4cd50da32fe2b4167f97c8142102a0510d Url https://gitbox.apache.org/repos/asf/spark.git Type --help for more information.
解決したいこと
下記のようなSpark DataFrameオブジェクトがあります。
% pyspark >>> df = spark.createDataFrame( [ ('7d4215d0-ab05-4372-9681-b41f925e3458', 0, 1608976046746), ('e36b7dfa-5327-4e33-a6cf-a34d6ce2027d', 1, 1608976059078), ('3ff9c44a-2a66-49df-bb70-0df07a749a61', 1, 1608976150001) ], ['device_id', 'state', 'timestamp'] )
このDataFrameオブジェクトはshow()
メソッドを実行することにより内容をコンソール表示させることができます。しかし、下記のように長い値だと...
のように表示が省略されてしまいます。
>>> df.show() +--------------------+-----+-------------+ | device_id|state| timestamp| +--------------------+-----+-------------+ |7d4215d0-ab05-437...| 0|1608976046746| |e36b7dfa-5327-4e3...| 1|1608976059078| |3ff9c44a-2a66-49d...| 1|1608976150001| +--------------------+-----+-------------+
このように長い値を省略させずにすべて表示させたいです。
省略させない方法
Apache Sparkのドキュメントを確認すると、show()
メソッドにはtruncate
というオプションがあるようです。
truncate
オプションの既定値はTrue
で、文字数が最大20文字となるようです。
- truncate – If set to True, truncate strings longer than 20 chars by default. If set to a number greater than one, truncates long strings to length truncate and align cells right.
また下記によると値をFalse
とすれば省略されなくなるようです。
show(truncate=False)
として実行したところ、値を省略せずに表示できました。
>>> df.show(truncate=False) +------------------------------------+-----+-------------+ |device_id |state|timestamp | +------------------------------------+-----+-------------+ |7d4215d0-ab05-4372-9681-b41f925e3458|0 |1608976046746| |e36b7dfa-5327-4e33-a6cf-a34d6ce2027d|1 |1608976059078| |3ff9c44a-2a66-49df-bb70-0df07a749a61|1 |1608976150001| +------------------------------------+-----+-------------+
その他の便利なオプション
n
オプションを使えば、表示するレコード数を指定できます。すべてのレコードを表示する必要がない場合に便利です。
>>> df.show(n=1) +--------------------+-----+-------------+ | device_id|state| timestamp| +--------------------+-----+-------------+ |7d4215d0-ab05-437...| 0|1608976046746| +--------------------+-----+-------------+ only showing top 1 row
vertical
オプションを使えば、レコードを縦に表示できます。カラム数が多い場合に便利です。
>>> df.show(vertical=True) -RECORD 0------------------------- device_id | 7d4215d0-ab05-437... state | 0 timestamp | 1608976046746 -RECORD 1------------------------- device_id | e36b7dfa-5327-4e3... state | 1 timestamp | 1608976059078 -RECORD 2------------------------- device_id | 3ff9c44a-2a66-49d... state | 1 timestamp | 1608976150001
truncate
オプションと組み合わせることももちろん可能です。
>>> df.show(truncate=False, vertical=True) -RECORD 0----------------------------------------- device_id | 7d4215d0-ab05-4372-9681-b41f925e3458 state | 0 timestamp | 1608976046746 -RECORD 1----------------------------------------- device_id | e36b7dfa-5327-4e33-a6cf-a34d6ce2027d state | 1 timestamp | 1608976059078 -RECORD 2----------------------------------------- device_id | 3ff9c44a-2a66-49df-bb70-0df07a749a61 state | 1 timestamp | 1608976150001
おわりに
SparkのDataFrameをshow()
メソッドでコンソール表示する際に、長い値が省略されないようにする方法を確認してみました。
show()
メソッドはSparkのコードのデバッグで多用するので覚えておきたいですね。
以上