web-dev-qa-db-ja.com

Sparkで、複数の小さなファイルをいくつかの大きなファイルにマージします

私はHivethroughSparkを使用しています。 sparkコードに、パーティションテーブルへの挿入クエリがあります。入力データは200 + GBです。Sparkがパーティションテーブルに書き込んでいる場合、は非常に小さなファイル(kb単位のファイル)を吐き出しているので、出力パーティションテーブルフォルダーには5000以上の小さなkbファイルがあります。これらをいくつかの大きなMBファイルにマージしたいのですが、200MBのファイルがいくつかあるかもしれません。Hiveマージ設定を使用するのに疲れました。 、しかし、それらは機能していないようです。

'val result7A = hiveContext.sql("set Hive.exec.dynamic.partition=true")

 val result7B = hiveContext.sql("set Hive.exec.dynamic.partition.mode=nonstrict")

val result7C = hiveContext.sql("SET Hive.merge.size.per.task=256000000")

val result7D = hiveContext.sql("SET Hive.merge.mapfiles=true")

val result7E = hiveContext.sql("SET Hive.merge.mapredfiles=true")

val result7F = hiveContext.sql("SET Hive.merge.sparkfiles = true")

val result7G = hiveContext.sql("set Hive.aux.jars.path=c:\\Applications\\json-serde-1.1.9.3-SNAPSHOT-jar-with-dependencies.jar")

val result8 = hiveContext.sql("INSERT INTO TABLE partition_table PARTITION (date) select a,b,c from partition_json_table")'

上記のHive設定は、mapreduce Hiveの実行で機能し、指定されたサイズのファイルを吐き出します。これを行うオプションはありますかSparkまたはScala?

8
dheee

DataFrame.coalesce メソッドを使用してみてください。指定された数のパーティションを持つDataFrameを返します(各パーティションは挿入時にファイルになります)。したがって、挿入するレコードの数と各レコードの一般的なサイズを使用して、最大200MBのファイルが必要な場合に合体するパーティションの数を見積もることができます。

1
zweiterlinde

私も同じ問題を抱えていました。解決策は、パーティション列にDISTRIBUTEBY句を追加することでした。これにより、1つのパーティションのデータが単一のレデューサーに確実に送信されます。あなたの場合の例:

INSERT INTO TABLE partition_table PARTITION (date) select a,b,c from partition_json_table DISTRIBUTE BY date
8
Jussi Kujala

この場合、dataframe repartition(1) メソッドが機能します。

0
gszecsenyi