PySpark: объединить два столбца с типом данных Struc -> Ошибка: невозможно устранить из-за несоответствия типов данных - PullRequest
0 голосов
/ 08 января 2019

У меня есть таблица данных в PySpark, которая содержит два столбца с типом данных Struc.

Пожалуйста, см. Образец кадра ниже:

word_verb                   word_noun
{_1=cook, _2=VB}            {_1=chicken, _2=NN}
{_1=pack, _2=VBN}           {_1=lunch, _2=NN}
{_1=reconnected, _2=VBN}    {_1=wifi, _2=NN}

Я хочу объединить два столбца вместе, чтобы я мог сделать подсчет частоты объединенного глагола и существительного чанка.

Я попробовал код ниже:

df = df.withColumn('word_chunk_final', F.concat(F.col('word_verb'), F.col('word_noun')))  

Но я получаю следующую ошибку:

AnalysisException: u"cannot resolve 'concat(`word_verb`, `word_noun`)' due to data type mismatch: input to function concat should have been string, binary or array, but it's [struct<_1:string,_2:string>, struct<_1:string,_2:string>]

Моя желаемая выходная таблица выглядит следующим образом. Конкатенированное новое поле будет иметь тип строки:

word_verb                   word_noun               word_chunk_final
{_1=cook, _2=VB}            {_1=chicken, _2=NN}     cook chicken
{_1=pack, _2=VBN}           {_1=lunch, _2=NN}       pack lunch
{_1=reconnected, _2=VBN}    {_1=wifi, _2=NN}        reconnected wifi 

1 Ответ

0 голосов
/ 08 января 2019

Ваш код почти там.

Предполагается, что ваша схема выглядит следующим образом:

df.printSchema()
#root
# |-- word_verb: struct (nullable = true)
# |    |-- _1: string (nullable = true)
# |    |-- _2: string (nullable = true)
# |-- word_noun: struct (nullable = true)
# |    |-- _1: string (nullable = true)
# |    |-- _2: string (nullable = true)

Вам просто нужно получить доступ к значению поля _1 для каждого столбца:

import pyspark.sql.functions as F

df.withColumn(
    "word_chunk_final", 
    F.concat_ws(' ', F.col('word_verb')['_1'], F.col('word_noun')['_1'])
).show()
#+-----------------+------------+----------------+
#|        word_verb|   word_noun|word_chunk_final|
#+-----------------+------------+----------------+
#|        [cook,VB]|[chicken,NN]|    cook chicken|
#|       [pack,VBN]|  [lunch,NN]|      pack lunch|
#|[reconnected,VBN]|   [wifi,NN]|reconnected wifi|
#+-----------------+------------+----------------+

Кроме того, вы должны использовать concat_ws ("объединить с разделителем") вместо concat, чтобы добавить строки вместе с пробелом между ними. Это похоже на то, как str.join работает в Python.

...