Не удалось удалить пробел из имен столбцов в spark scala

#scala #apache-spark #hadoop #bigdata

Вопрос:

У меня есть имена столбцов набора данных parquet с пробелами между словами, например: BRANCH NAME . Теперь, когда я заменяю пробел "_" и пытаюсь распечатать столбец, это приводит к ошибке. Ниже приведен мой код с несколькими подходами, за которыми следует ошибка:

Подход 1:

 Var df= spark.read.parquet("s3://tvsc-lumiq-edl/raw-v2/LMSDB/DESUSR/TBL_DES_SLA_MIS1")


for (c <- df.columns){
        df = df.withColumnRenamed(c, c.replace(" ", ""))
}
 

Подход 2:

 df = df.columns.foldLeft(df)((curr, n) => curr.withColumnRenamed(n, n.replaceAll("\s", "")))
 

Подход 3:

 val new_cols =  df.columns.map(x => x.replaceAll(" ", "")) 

val df2 = df.toDF(new_cols : _*)   
 

Ошибка:

 org.apache.spark.sql.AnalysisException: Attribute name "BRANCH NAME" contains invalid character(s) among " ,;{}()nt=". Please use alias to rename it.;  
 

Ниже приведена схема:

 scala> df.printSchema()
root
 |-- dms_timestamp: string (nullable = true)
 |-- BRANCH NAME: string (nullable = true)
 |-- BRANCH CODE: string (nullable = true)
 |-- DEALER NAME: string (nullable = true)
 |-- DEALER CODE: string (nullable = true)
 |-- DEALER CATEGORY: string (nullable = true)
 |-- PRODUCT: string (nullable = true)
 |-- CREATION DATE: string (nullable = true)
 |-- CHANNEL TYPE: string (nullable = true)
 |-- DELAY DAYS: string (nullable = true)
 

Я также ссылался на несколько сообщений SO, но это не помогло.

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

1. можете ли вы добавить примеры данных ?

2. Я не могу распечатать данные, так как при попытке печати появляется та же ошибка

3. Ваш подход 3 определенно должен работать, может быть, проверить, есть ли какие-либо другие специальные символы, можете ли вы проверить с помощью df.show(false) перед изменением имен столбцов?

4. Это приводит к ошибке

5. С какой ошибкой вы сталкиваетесь df.show(false)

Ответ №1:

Попробуйте выполнить код ниже.

 df
.select(df.columns.map(c => col(s"`${c}`").as(c.replace(" ",""))):_*)
.show(false)

 

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

1. Та же ошибка. Это что-то с паркетом ?

2. о … я думаю, что между именем столбца должны быть какие-то специальные символы.

3. Здесь нет никаких специальных символов. Я отобразил схему

Ответ №2:

Это сработало для меня

 val dfnew =df.select(df.columns.map(i => col(i).as(i.replaceAll(" ", ""))): _*)
 

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

1. Это в наборе данных для паркета? Или что-то еще ? Потому что мой код работает для файлов, отличных от паркетных

2. Его набор данных не является паркетным, можете ли вы попробовать удалить ИМЯ ВЕТВИ столбца из фрейма данных и применить описанную выше логику? чтобы узнать, есть ли какие-либо проблемы с этой конкретной колонкой.

3. Да, я попытался создать новый столбец с данными этого столбца, но при отображении он выдает ту же ошибку

Ответ №3:

Если все наборы данных находятся в файлах parquet, боюсь, нам не повезло, и вам придется загрузить их в Pandas, а затем выполнить переименование.

Spark вообще не будет читать файлы с именами столбцов, содержащими символы среди « ,;{}()nt= «. AFAIK, разработчики Spark отказались решить эту проблему. Основная причина этого кроется в самих ваших файлах паркета. По крайней мере, согласно разработчику, в файлах parquet в первую очередь не должно быть этих «недопустимых символов» в именах столбцов.

Видишь https://issues.apache.org/jira/browse/SPARK-27442 . Он был помечен как «не будет исправлен».