Spark SQL错误AnalysisException:无法解析column_name

时间:2018-06-11 12:21:51

标签: apache-spark apache-spark-sql

这是Spark SQL中的一个常见错误,我尝试了所有其他答案但没有差异! 我想从HDFS(甚至本地文件系统)中读取以下小型CSV文件。

git clone <repo> --depth=1 --branch=<dev or whatever>

以下是代码:

+----+-----------+----------+-------------------+-----------+------+------+------+------+------+
|  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());

在某些情况下,它可以正常工作:

  1. 如果我没有选择任何内容,它将成功获取所有数据。
  2. 如果我只选择列“id”。
  3. 即使我尝试使用视图 SQL 方法:

    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
    

    但是我得到了同样的错误!

    我使用从数据库中读取的相同数据做了同样的事情,并且没有任何错误。

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

2 个答案:

答案 0 :(得分:2)

无需转换String [] - &gt;列表与LT;字符串&GT; - &GT; SEQ&LT;字符串&GT;

只需在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(","));

答案 1 :(得分:2)

这是因为CSV文件的结构不正确!我从CSV文件中删除了white spaces,现在可以正常使用了!