次のタイプの JavaPairRDD があります。
Tuple2<String, Iterable<Tuple2<String, Iterable<Tuple2<String, String>>>>>
次のオブジェクトを示します:
(Table_name, Iterable (Tuple_ID, Iterable (Column_name, Column_value)))
これは、RDD の各レコードが 1 つの Parquet ファイルを作成することを意味します。
ご想像のとおり、各オブジェクトを Table_name という名前の新しいParquetテーブルとして保存するという考え方です。このテーブルには、値Tuple_IDを格納するIDという 1 つの列があり、各列Column_nameには値Column_valueが格納されます。
私が直面している課題は、テーブルの列 (スキーマ) が実行時にオンザフライで収集されることと、Spark でネストされた RDD を作成できないため、以前の RDD 内で RDD を作成できないことです (もちろん、データフレームに変換した後、最終的にParquetファイルに保存します。
また、明らかな理由 (列/値を取得するために反復する必要がある) から、以前の RDD を DataFrame に変換することはできません。
一時的な回避策として、RDD を使用して RDD と同じ型のリストにフラット化しましたcollect()
が、これは適切な方法ではありません。データがドライバー マシンの使用可能なディスク領域よりも大きくなり、メモリ不足が発生する可能性があるためです。
これを達成する方法について何かアドバイスはありますか?質問が十分に明確でない場合はお知らせください。