Исключительная ошибка SQL AnalysisException: не удается разрешить имя_ столбца - PullRequest
0 голосов
/ 11 июня 2018

Это распространенная ошибка в Spark SQL, я пробовал все остальные ответы, но без различий!Я хочу прочитать следующий небольшой CSV-файл из HDFS (или даже из локальной файловой системы).

+----+-----------+----------+-------------------+-----------+------+------+------+------+------+
|  id| first_name| last_name|                ssn|      test1| test2| test3| test4| final| grade|
+----+-----------+----------+-------------------+-----------+------+------+------+------+------+
| 4.0|      Dandy|       Jim|        087-75-4321|       47.0|   1.0|  23.0|  36.0|  45.0|    C+|
|13.0|   Elephant|       Ima|        456-71-9012|       45.0|   1.0|  78.0|  88.0|  77.0|    B-|
|14.0|   Franklin|     Benny|        234-56-2890|       50.0|   1.0|  90.0|  80.0|  90.0|    B-|
|15.0|     George|       Boy|        345-67-3901|       40.0|   1.0|  11.0|  -1.0|   4.0|     B|
|16.0|  Heffalump|    Harvey|        632-79-9439|       30.0|   1.0|  20.0|  30.0|  40.0|     C|
+----+-----------+----------+-------------------+-----------+------+------+------+------+------+

Вот код:

List<String> cols = new ArrayList<>();
        Collections.addAll(cols, "id, first_name".replaceAll("\\s+", "").split(","));
Dataset<Row> temp = spark.read()
                .format("org.apache.spark.csv")
                .option("header", true)
                .option("inferSchema", true)
                .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ")
                .csv(path)
                .selectExpr(JavaConverters.asScalaIteratorConverter(cols.iterator()).asScala().toSeq());

, но с ошибками:

Exception in thread "main" org.apache.spark.sql.AnalysisException: resolved attribute(s) 'first_name missing from  last_name#14,      test1#16,id#12, test4#19, ssn#15, test3#18, grade#21, test2#17, final#20, first_name#13 in operator 'Project [id#12, 'first_name];;
'Project [id#12, 'first_name]
+- Relation[id#12, first_name#13, last_name#14, ssn#15,      test1#16, test2#17, test3#18, test4#19, final#20, grade#21] csv

В некоторых случаях это работает без ошибок:

  1. Если я ничего не выбрал, он успешно получит все данные.
  2. Если я просто выберу столбец "id".

Даже я пытался использовать представления и SQL метод:

df.createOrReplaceTempView("csvFile");
spark.sql(SELECT id, first_name FROM csvFile).show()

но я получил ту же ошибку!

Я сделал то же самое с теми же данными, которые я прочитал из базы данных, и это было безо всякой ошибки.

Я использую Spark 2.2.1.

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Это было из-за неправильной структуры файла CSV!Я удалил white spaces из файла CSV и теперь он работает!

0 голосов
/ 12 июня 2018

Нет необходимости преобразовывать String [] -> List -> Seq .

Просто передайте массив в методе selectExpr, потому что selectExpr поддерживает тип данных varargs.

Dataset<Row> temp = spark.read()
                .format("org.apache.spark.csv")
                .option("header", true)
                .option("inferSchema", true)
                .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ")
                .csv(path)
                .selectExpr("id, first_name".replaceAll("\\s+", "").split(","));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...