多くの列がある寄木細工のファイルからsparkの列のサブセットのみを読み取る最も効率的な方法は何ですか?spark.read.format("parquet").load(<parquet>).select(...col1, col2)
を使用するのが最善の方法ですか?Iまた、スキーマを事前定義するためにケースクラスでタイプセーフなデータセットを使用することを好むでしょうが、確信が持てません。
val df = spark.read.parquet("fs://path/file.parquet").select(...)
これは、対応する列のみを読み取ります。確かに、寄木細工は円柱状のストレージであり、まさにこのタイプのユースケースを対象としています。 df.explain
を実行してみて、sparkは、対応する列のみが読み取られることを通知します(実行プランを出力します)。explain
は、どのフィルターがプッシュされたかを通知します。 where条件も使用する場合の物理的な実行計画に至るまで、最後に次のコードを使用して、データフレーム(行のデータセット)をケースクラスのデータセットに変換します。
case class MyData...
val ds = df.as[MyData]
SparkはParquetでプッシュダウンをサポートしているため
load(<parquet>).select(...col1, col2)
結構です。
私はまた、スキーマを事前定義するためにケースクラスでタイプセーフなデータセットを使用することを好みますが、確実ではありません。
このコンテキストでは一部の最適化が機能しないように見えるため、これは問題になる可能性があります Spark 2.0 Dataset vs DataFrame
寄木細工は、円柱状のファイル形式です。これは、このような使用例向けに設計されています。
val df = spark.read.parquet("<PATH_TO_FILE>").select(...)
あなたのために仕事をする必要があります。