Spark (Scala): имя атрибута содержит недопустимый символ

Пытаясь записать DataFrame в HDFS, я столкнулся со следующей проблемой:

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

Источником для DataFrame является csv-файл:

       "value_hash", "someName1"
       79000000000, name1
       79000000000, name2

Этот csv прочитан:

    val dataFrame = SparkSession.read.option("header", "true").csv(path) 

Затем я выбираю и привожу типы для этого dataFrame:

   def castColumn(colName: String, colType: String): Column = col(colName).cast(DataType.fromJson(colType))

val featureColumns: Seq[(PathString, String)] = dataFrame.columns.tail.map(f=>(f, "\"string\"")).toSeq

val columns = (schema ++ featureColumns).
  map { case (colName, colType) => castColumn(colName, colType) }
dataFrame.select(columns.toSeq: _*)

где схема имеет тип: Map[String, String] и имеет значение по умолчанию Map("value_hash" -> ""string"")

В этом коде я добавляю схему featureColumns к схеме по умолчанию (поскольку я не знал полной исходной схемы - она ​​создавалась динамически после чтения csv из hdfs).

Затем я пытаюсь записать этот DataFrame в hdfs-path:

  dataFrame
      .repartition(1)
      .write
      .parquet(outputPath)

Следуя рекомендации в сообщении об ошибке, я попытался использовать псевдоним для каждого столбца, поэтому:

 filteredRemove.columns.foreach{
  ca=>filteredRemove.select(col(ca).alias(ca)))
}
 

и так:

filteredRemove.columns.foreach{
  ca=>filteredRemove.select(col(ca).alias(ca)).show()
}

Но результат был тот же: org.apache.spark.sql.AnalysisException...

Замечает пробелы и кавычки в ""someName1"", я также пытался очистить псевдоним от этого:

 filteredRemove.columns.foreach{
  ca=>filteredRemove.select(col(ca).alias(ca.trim.substring(0,ca.length-1))).show()
}

Но без какого-либо результата. Я все еще сталкиваюсь с исключением, которое показано выше.

Что я делаю не так?

Похоже, что "someName1" имеет лидирующее место.

过过招 16.03.2022 10:10

Я попытался удалить это пространство с помощью String.trim(). Но без результата. Я показал эту попытку в своем посте

Jelly 16.03.2022 10:12

Пожалуйста, добавьте воспроизводимый код с образцом

David דודו Markovitz 16.03.2022 10:14

Дэвид, я обновил вопрос с образцом

Jelly 16.03.2022 10:21

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

David דודו Markovitz 16.03.2022 10:30

Дэвид, я обновляю свой вопрос с полным рабочим процессом

Jelly 16.03.2022 10:47

Не совсем то, что я имел в виду. Смотрите мой ответ, который включает в себя создание проблемы и решение. Дайте мне минуту, и я также продемонстрирую переименование столбца Suck.

David דודו Markovitz 16.03.2022 10:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Установите для ignoreLeadingWhiteSpace значение true, чтобы устранить проблему уже во время загрузки.

Исходный код

val df_original = spark.read.option("header",true).csv(path)

println((for(c <- df_original.columns) yield s"`$c`").mkString(","))

`value_hash`,` "someName1"`

Способы переименования столбца после загрузки

val df_renamed_1 = df_original.withColumnRenamed(" \"someName1\"", "someName1")

println((for(c <- df_renamed_1.columns) yield s"`$c`").mkString(","))

`value_hash`,`someName1`

val df_renamed_2 = df_original.withColumnRenamed(""" "someName1"""", "someName1")

println((for(c <- df_renamed_2.columns) yield s"`$c`").mkString(","))

`value_hash`,`someName1`

Способы избежать проблемы во время загрузки (включая option("ignoreLeadingWhiteSpace",true))

val df_fixed = spark.read.option("header",true).option("ignoreLeadingWhiteSpace",true).csv(path)

println((for(c <- df_fixed.columns) yield s"`$c`").mkString(","))

`value_hash`,`someName1`

Я попробую. Через 10 минут скажу результат

Jelly 16.03.2022 10:52

Другие вопросы по теме