1

私たちのクラスターには Spark 1.3 と Hive があり、ランダムに選択された行を追加する必要がある大きな Hive テーブルがあります。条件を読み取ってチェックする小さなテーブルがあり、その条件が真の場合は、必要な変数を取得してから、ランダムな行を埋めるためにクエリを実行します。私がしたことは、その条件でクエリを実行し、table.where(value<number)を使用して配列にしtake(num rows)ました。次に、これらすべての行には、大規模なハイブ テーブルから必要なランダムな行に関する必要な情報が含まれているため、配列を反復処理します。

クエリで使用するクエリを実行するときORDER BY RAND()(を使用sqlContext)。var Hive table大きなテーブルから列を追加して(変更可能にする)を作成しました。ループでは、unionAll を実行しますnewHiveTable = newHiveTable.unionAll(random_rows)

これを行うためにさまざまな方法を試しましたが、CPU と一時ディスクの使用を避けるための最善の方法がわかりません。データフレームは増分追加を目的としていないことを知っています。私が今試みなければならないことの1つは、cvsファイルを作成し、そのファイルにランダムな行をループでインクリメンタルに書き込み、ループが終了したら、cvsファイルをテーブルとしてロードし、1つのunionAllを実行して最終的な結果を取得することですテーブル。

どんなフィードバックも素晴らしいでしょう。ありがとう

4

1 に答える 1

2

ハイブを使用して外部テーブルを作成し、場所を定義してから、spark に出力を csv としてそのディレクトリに書き込むことをお勧めします。

ハイブで:

create external table test(key string, value string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';'
LOCATION '/SOME/HDFS/LOCATION'

そして、スパークからhttps://github.com/databricks/spark-csv を使用して、データフレームを csv ファイルに書き込み、既存のファイルに追加します。

df.write.format("com.databricks.spark.csv").save("/SOME/HDFS/LOCATION/", SaveMode.Append)
于 2016-04-26T16:02:36.987 に答える