(问题已解决!)
我正在尝试使用“以编程方式指定架构”(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
然后一切正常!