使用编程模式的Spark SQL将引发奇怪的异常

时间:2018-10-24 02:16:57

标签: sql scala apache-spark schema

(问题已解决!)

我正在尝试使用“以编程方式指定架构”(http://spark.apache.org/docs/latest/sql-programming-guide.html)。 我有这个my.txt文件作为输入:

"A", 1, 2
"B", 2, 3
"B", 13,6
"C", 3, 4

然后我有一个spark程序来阅读和解释它:

val rowRdd = spark.sparkContext.textFile("my.txt")
.map(_.split(","))
.map(a => Row(a(0), a(1).trim.toInt, a(2).trim.toInt))
val schema = StructType("a b c".split(" ")
.map(f => StructField(f, StringType, nullable = true)))
spark.createDataFrame(rowRdd, schema).createOrReplaceTempView("people")
spark.sql("select * from people").show()

运行spark-submit时,它会给出异常:

java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: java.lang.Integer is not a valid external type for schema of string
if (assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt) null else staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, a), StringType), true) AS a#0
+- if (assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt) null else staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, a), StringType), true)
   :- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt
   :  :- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object)
   :  :  +- input[0, org.apache.spark.sql.Row, true]
   :  +- 0
... ...(many lines)

事实上,在我的第三行中

Row(a(0), a(1).trim.toInt, a(2).trim.toInt))

第一个元素是字符串,我没有将其转换为整数。但是错误消息是“ java.lang.Integer不是字符串模式的有效外部类型”。

那么我的程序在哪里出错了,以及如何解决?非常感谢。


问题解决,不应包含“”来引用字段,将输入文件更改为:

A, 1, 2
B, 2, 3
B, 13,6
C, 3, 4

然后一切正常!

0 个答案:

没有答案