Как обрабатывать повторяющиеся столбцы в определении таблицы

#scala #apache-spark #pyspark #apache-spark-sql #spark-streaming

#scala #apache-spark #pyspark #apache-spark-sql #искровая передача

Вопрос:

Дан фрейм данных со следующей схемой. Проблема в том, что фрейм данных является динамическим, как и его поле. Таким образом, вы можете предварительно принять заданную схему.

 root
 |-- a: string (nullable = true)
 |-- b: string (nullable = true)
 |-- c: string (nullable = true)
 |-- a: string (nullable = true)
 |-- b: long (nullable = true)
 |-- c: long (nullable = true)
 |-- d: long (nullable = true)
 |-- a: long (nullable = true)
  

Отображается следующая ошибка :-

 Found duplicate column(s) in table definition
  

как мы должны переименовать имя столбца, чтобы устранить двусмысленность

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

1. вы можете просто использовать toDF после чтения фрейма данных и передать явные имена столбцов.

Ответ №1:

Вот как вы можете переименовать его

 import spark.implicits._

val df = Seq(
  ("a", 1, "a"),
  ("a", 1, "a"),
  ("a", 1, "a")
).toDF("a", "x", "a")

val columns = List("a", "b", "c")
val newDF = df.toDF(columns: _*)

newDF.show(false)
newDF.printSchema()
  

Новый вывод:

  --- --- --- 
|a  |b  |c  |
 --- --- --- 
|a  |1  |a  |
|a  |1  |a  |
|a  |1  |a  |
 --- --- --- 
  

Новая схема:

 root
 |-- a: string (nullable = true)
 |-- b: integer (nullable = false)
 |-- c: string (nullable = true)
  

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

1. То же самое работает с python: df.toDF(*["a", "b", "c"])

2. Проблема в том, что фрейм данных является динамическим, как и его поле. Таким образом, вы можете предварительно принять заданную схему.