0

次のコマンドを使用して、最初の爆発の後に 2 番目の爆発を実行しています。

myExplode = sqlContext.sql("select explode(names) as name_x from myTable")
myExplode = sqlContext.sql("select explode(name_x) as name1 from myTable")
myExplode.show(6,False)

その後、エラーが発生しました: u"cannot resolve 'name_x' given input columns: [names, fieldA, fieldB, fieldC]; line 1 pos 15"

ただし、最初の爆発は問題なく機能します。2回目の爆発で何か間違ったことはありますか?


次に例を示します。

+---------------------------------------------------------------------------------+
|names                                                                            |
+---------------------------------------------------------------------------------+
|[[[Max,White,WrappedArray(SanDiego)],3], [[Spot,Black,WrappedArray(SanDiego)],2]]|
|[[[Michael,Black,WrappedArray(SanJose)],1]]                                      |
+---------------------------------------------------------------------------------+

最初の爆発の後、私は得ました:

+-----------------------------------------+
|name_x                                   |
+-----------------------------------------+
|[[Max,Black],3]                          |
|[[Spot,White],2]                         |
|[[Michael,Yellow],1]                     |
+-----------------------------------------+

[Max,Black]、[Spot, White]、および [Michael, Yellow] を取得できるように、name_x で 2 番目の爆発を作成したいと考えています。この後、Max、Spot、Michael のみを取得して新しい列に配置できるように、3 回目の爆発を実行したいと考えています。これは可能ですか?

ありがとう!

4

1 に答える 1

2

explodes最初のものの後は必要ありません。データの一部を選択しているだけです。Explode は単一の行を取り、その行に基づいてさらに行を作成します。それはまさにあなたの最初の爆発が行うことであり、それは正しいです. 2 回目以降の変換では、新しい行を作成するのではなく、新しい列を作成します。withColumnまたは を使用して、新しい列を作成できますselect

あなたの場合、 内のネストされたデータにアクセスしようとしていますStructType。の個々のフィールドにアクセスするにはStructType、 を使用しますgetField。何かのようなもの:

`df.withColumn("newColumn", $"name_x".getField("fieldName"))

fieldNameを使用するかを理解する必要があります。よくわからない場合は、自分で使用してピークを取ってprintSchemaください。DataFrame

于 2016-04-26T11:45:38.923 に答える