したがって、xmlファイルからdataframe
を作成しています。それはディーラーに関するいくつかの情報を持っているし、ディーラーは複数の車を持っています - 各車はcars
要素のサブ要素であり、value
要素で表されます - 各cars.value
要素にはさまざまな車属性があります。だから私は、次のようにディーラーのためにそれぞれの車に1つの行を作成するためにexplode
機能を使用します。データフレームに存在しない列を選択する
exploded_dealer = df.select('dealer_id',explode('cars.value').alias('a_car'))
を、今私がcars.value
のさまざまな属性を取得したい私はこのようにそれを行う:
car_details_df = exploded_dealer.select('dealer_id','a_car.attribute1','a_car.attribute2')
これは問題なく動作します。しかし、時にはcars.value
要素に、私のクエリで指定したすべての属性が含まれていないことがあります。だから、例えば、いくつかの要素がcars.value
のみattribute1のがあるかもしれない - と、上記のコードの実行時に、私は次のエラーが発生します。
pyspark.sql.utils.AnalysisException:u」が解決できない与えられた 『attribute2の』 を入力列:[dealer_id、attribute1]; "
どのように私はsparkにとにかく同じクエリを実行するように頼むのですか? の属性2の場合は、None
を返してください。
initial_file_df = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='dealer').load('<xml file location>')
exploded_dealer = df.select('financial_data',explode('cars.value').alias('a_car'))
これは、Pythonコードではなく失敗したSQLクエリであるため、これは難しいです。私が驚いているのは、通常、データフレーム用に1つのスキーマがあり、このスキーマには属性を含めることができるかどうかということです。だからバグか、データセットを構築するのに手間がかかっていました。はいの場合は、指定してください。とにかく、興味深いのは、Spark SQLでTRYに相当するものがないということです。つまり、データフレームの作成時にすべての属性を持つスキーマを強制するなど、回避策を使用する必要があります。 – Wilmerton
「通常、データフレーム用に1つのスキーマがあるのは驚きです」 - つまり、私のコードは静的なので、ファイルから列a、b、cを常に取るように指定できます。そこにあり、私はそれらの3つの列だけが必要です。しかし、ある日には列a、b、dのxmlがあるかもしれませんが、c列のデータが得られない場合でも、まだa、b、cのみが必要です。私のコードは静的なので、a、b、cを求め、cが足りないので失敗するでしょう。 – Dennis
@Dennis私はそれがあなたの質問に対する答えではないことを知っていますが、それにもかかわらず助けになるかもしれません:まず、スキーマを取得し、それに応じてクエリを生成するロジックを作ることができます。 – Wilmerton