0

Я использую следующие команды, чтобы сделать второй взрываются после первого взрываются:SparkSQL второй взрываются после первого взрываются

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"

Однако первые взрываются работы просто хорошо. Что-то я сделал неправильно во время моего второго взрыва?


Вот пример:

+---------------------------------------------------------------------------------+ 
|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]      | 
+-----------------------------------------+ 

Теперь я хочу, чтобы сделать второй взрываются на name_x, так что я могу получить [ Max, Black], [Spot, White] и [Michael, Yellow]. После этого я даже хочу сделать третий взрыв, поэтому я могу получить только Max, Spot и Michael и поместить их в новый столбец. Это что-то возможно?

Спасибо!

+0

Выполнение второго взрыва на одном и том же поле, которое не существует. Что вы ожидали от этого? – eliasah

+0

, потому что столбец [names] представляет собой массив массива. Поэтому после первого взрыва открыть внешний массив, я хочу открыть второй (внутренний) массив. Благодаря! – Edamame

+0

Публикация образца набора данных всегда помогает другим людям решить вашу проблему. – dheee

ответ

2

Вы не хотите explodes после первого. Вы просто выбираете часть данных. Explode принимает одну строку и создает больше строк на основе этой строки. Это именно то, что делает ваш первый взрыв, и это правильно. Для второго и последующих преобразований вы не создаете новые строки - вы создаете новые столбцы. Вы можете создать новый столбец с withColumn или с помощью select.

В вашем случае вы пытаетесь добраться до вложенных данных в пределах StructType. Чтобы попасть в отдельные поля в StructType, вы используете getField. Что-то вроде:

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

Вы должны понять, что fieldName использовать - если вы не уверены, просто используйте printSchema на вашем DataFrame и взять пик.

+0

Спасибо. Но проблема в том, что у элемента нет имени поля. [[Max, Black], 3] - это всего лишь кортеж. Я пытался сделать df.withColumn ("newColumn", df.name_x.getField (_1)), но это не сработает. Как получить информацию, когда имя поля недоступно? Благодаря! – Edamame

+0

Теперь работает с getField ("_ 1"). благодаря! – Edamame

Смежные вопросы