#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 . Он был помечен как «не будет исправлен».