Spark DataFrameのshow()メソッドで長い値が省略されないようにする

2020.12.27

こんにちは、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のコードのデバッグで多用するので覚えておきたいですね。

以上