PySpark: добавление нового поля в элемент строки фрейма данных

#python #apache-spark #dataframe #row #pyspark

#python #apache-spark #фрейм данных #строка #pyspark

Вопрос:

У меня есть следующий элемент:

 a = Row(ts=1465326926253, myid=u'1234567', mytype=u'good') 
  

Строка относится к классу строк фрейма данных Spark. Я хочу добавить новое поле a , чтобы оно a выглядело как:

 a = Row(ts=1465326926253, myid=u'1234567', mytype=u'good', name = u'john') 
  

Ответ №1:

Вот обновленный ответ, который работает. Сначала вам нужно создать словарь, затем обновить dict, а затем записать его в строку pyspark.

Код выглядит следующим образом:

 from pyspark.sql import Row

#Creating the pysql row
row = Row(field1=12345, field2=0.0123, field3=u'Last Field')

#Convert to python dict
temp = row.asDict()

#Do whatever you want to the dict. Like adding a new field or etc.
temp["field4"] = "it worked!"

# Save or output the row to a pyspark rdd
output = Row(**temp)

#How it looks
output

In [1]:
Row(field1=12345, field2=0.0123, field3=u'Last Field', field4='it worked!')
  

Комментарии:

1. ВЫ НАСТОЯЩИЙ MVP

2. С помощью этого решения сохранение того же порядка столбцов в новой строке не гарантируется.

Ответ №2:

Вы не можете добавить новое поле в Row . Row является подклассом tuple

 from pyspark.sql import Row

issubclass(Row, tuple)
## True

isinstance(Row(), tuple)
## True
  

и Python tuples неизменяемы. Все, что вы можете сделать, это создать новое:

 row = Row(ts=1465326926253, myid=u'1234567', mytype=u'good') 

# In legacy Python: Row(name=u"john", **row.asDict())
Row(**row.asDict(), name=u"john") 
## Row(myid='1234567', mytype='good', name='john', ts=1465326926253)
  

Обратите внимание, что Row поля сортируются по имени.