Как записать кадр данных с повторяющимся именем столбца в файл csv в pyspark

Как я могу записать фрейм данных с тем же именем столбца после операции соединения в CSV-файл. В настоящее время я использую следующий код. dfFinal.coalesce(1).write.format('com.databricks.spark.csv').save('/home/user/output/',header = 'true')который запишет кадр данных «dfFinal» в «/home/user/output». Но он не работает в ситуации, когда кадр данных содержит повторяющийся столбец. Ниже приведен кадр данных dfFinal.

+----------+---+-----------------+---+-----------------+
|  NUMBER  | ID|AMOUNT           | ID|           AMOUNT|
+----------+---+-----------------+---+-----------------+
|9090909092|  1|               30|  1|               40|
|9090909093|  2|               30|  2|               50|
|9090909090|  3|               30|  3|               60|
|9090909094|  4|               30|  4|               70|
+----------+---+-----------------+---+-----------------+

Приведенный выше кадр данных формируется после операции соединения. При записи в файл csv выдает следующую ошибку.

pyspark.sql.utils.AnalysisException: u'Found duplicate column(s) when inserting into file:/home/user/output: `amount`, `id`;'

person Nandu    schedule 03.10.2018    source источник
comment
Я думаю, что лучше всего переименовать столбец перед записью.   -  person Sailesh Kotha    schedule 03.10.2018


Ответы (1)


Когда вы указываете столбец соединения как тип строки или массива, это приведет только к одному столбцу [1]. Пример писпарка:

l = [('9090909092',1,30),('9090909093',2,30),('9090909090',3,30),('9090909094',4,30)] 
r = [(1,40),(2,50),(3,60),(4,70)]

left = spark.createDataFrame(l, ['NUMBER','ID','AMOUNT'])
right = spark.createDataFrame(r,['ID','AMOUNT'])

df = left.join(right, "ID")
df.show()

+---+----------+------+------+
| ID| NUMBER   |AMOUNT|AMOUNT|
+---+----------+------+------+ 
| 1 |9090909092| 30   | 40   |
| 3 |9090909090| 30   | 60   |
| 2 |9090909093| 30   | 50   |
| 4 |9090909094| 30   | 70   |
+---+----------+------+------+

Но это все равно приведет к дублированию имен столбцов в кадре данных для всех столбцов, которые не являются столбцом соединения (столбец AMOUNT в этом примере). Для этих типов столбцов вы должны назначить новое имя до или после соединения с функцией кадра данных toDF [2]:

newNames = ['ID','NUMBER', 'LAMOUNT', 'RAMOUNT']
df= df.toDF(*newNames)
df.show()

+---+----------+-------+-------+ 
| ID| NUMBER   |LAMOUNT|RAMOUNT|
+---+----------+-------+-------+ 
| 1 |9090909092| 30    | 40    | 
| 3 |9090909090| 30    | 60    | 
| 2 |9090909093| 30    | 50    | 
| 4 |9090909094| 30    | 70    | 
+---+----------+-------+-------+

[1] https://docs.databricks.com/spark/latest/faq/join-two-dataframes-duplicated-column.html

[2] http://spark.apache.org/docs/2.2.1/api/python/pyspark.sql.html#pyspark.sql.DataFrame.toDF

person cronoik    schedule 06.10.2018