2017-09-22 11 views
-1

私のスパークストリーミングジョブは、圧縮されたXMLファイルを圧縮解除し、それをparquetファイルに文字列として追加します。 私のバッチジョブは、パーケットファイルを読み込みます。このファイルには、解凍されたxml文字列が1つだけ含まれています。寄木細工の列からXML文字列を抽出する方法

寄せ木ファイルスキーマ:

DF.printSchema() 

ルート
| - 解凍:寄木細工のファイル内の文字列(真= NULL可能)

サンプルレコード

DF.show(1,False) 

|decompress               
------------------------------------------------+ 
|<Sale><ItemID >10</ItemID>......</Sale> 

はです私はデータレンガXMLを適用することができます何らかの方法xml要素を抽出するためのパッケージ。 UDFを書く以外の選択肢はありますか?私は、UDFの処理に時間がかかることを考慮して、UDFを第2の選択肢として維持しています。

答えて

1

spark-xmlパッケージは、RDD/DF以外のファイルにのみ適用できます。ここでの唯一のオプションは、DF.write.text()を使用してテキストファイルとしてDFを一時的なパスの下に保存し、新しく保存されたファイルを読むことです。

ここで質問があります。スパークストリーミングジョブでXMLを1列の寄木細工ファイルとして保存するのはなぜですか? spark-xmlパッケージで読むことができるテキストファイルを計画してみませんか?

+0

ありがとう、マリウス。ストリーミングジョブは、リアルタイムのレポート作成の目的で、圧縮されたXMLから特定の列を抽出する必要があります。私のバッチジョブは、下流システムのデータを準備する必要があります。バッチジョブは1日に1回実行されます。ストリーミングジョブでは、XMLファイルを解凍し、レポートに必要な列を抽出し、バッチ処理用のデータを準備しようとしています(バッチジョブでは完全なXMLコンテンツが必要です)。バッチ処理では、非常に小さなファイルを何千も持っていたくないので、各ストリームを別々のファイルに保存するのではなく、ファイルに追加しようとしています。 –

+0

AFAIKでは、(ストリーミングジョブで)パーケットデータセットに追加しても、ディレクトリに小さなファイルが作成されます。スパークでは、簡単に寄木細工ファイルに追加することはできません。[SPARK-18199](https://issues.apache.org/jira/browse/SPARK-18199)を参照してください。書き込み方法を生テキストファイルに変更すると、バッチジョブで直接読み込むことができます。 – Mariusz