我有一个csv文件:
姓名,年龄,性别
name1,25,male
name1same,25,male
name2,30,female
name3,27,male
name4,28,female
第一行是标题,但它包含中文字符。
我的代码是:
val sparkSession = SparkSession
.builder()
.master("local")
val peopleDF = sparkSession.read.option("header", "true").csv("people.csv")
peopleDF.show()
peopleDF.createOrReplaceTempView("table")
val sorted = sparkSession.sql("SELECT 年龄 , 姓名 FROM table ORDER BY 年龄 ASC, 姓名 DESC ")
sorted.show()
运行时会弹出异常:
17/02/17 16:43:58 INFO TaskSchedulerImpl: Removed TaskSet 2.0, whose tasks have all completed, from pool
17/02/17 16:43:58 INFO DAGScheduler: ResultStage 2 (show at MyCalss.scala:63) finished in 0.046 s
17/02/17 16:43:58 INFO DAGScheduler: Job 2 finished: show at MyCalss.scala:63, took 0.071916 s
17/02/17 16:43:58 INFO CodeGenerator: Code generated in 14.40872 ms
+---------+---+------+
| 姓名| 年龄| 性别|
+---------+---+------+
| name1| 25| male|
|name1same| 25| male|
| name2| 30|female|
| name3| 27| male|
| name4| 28|female|
+---------+---+------+
17/02/17 16:43:58 INFO SparkSqlParser: Parsing command: table
17/02/17 16:43:58 INFO SparkSqlParser: Parsing command: SELECT 年龄 , 姓名 FROM table ORDER BY 年龄 ASC, 姓名 DESC
Exception in thread "main" org.apache.spark.sql.catalyst.parser.ParseException:
no viable alternative at input 'SELECT 年'(line 1, pos 7)
== SQL ==
SELECT 年龄 , 姓名 FROM table ORDER BY 年龄 ASC, 姓名 DESC
-------^^^
at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:197)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:99)
at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:45)
at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parsePlan(ParseDriver.scala:53)
at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:592)
如果我更改字段名称t英文名称,年龄和性别,它运作良好。 那么剂量SparkSqlParser支持汉字?如果是的话,我应该如何更改我的代码?
感谢。
答案 0 :(得分:0)
我遇到了同样的问题。 我有数据集:
标记,值
标记1,1
标记2,2
标记3,3
标记4,4
标记5,5
标记6,6
标记7,7
标记8,8
标记9,9
.......
我加载数据后,我试着这样做:
df.filter("标记 = '标记10'").show()
我得到了例外:
17/06/23 16:58:12 INFO SparkSqlParser: Parsing command: 标记 = '标记10'
mismatched input '标' expecting {'(', 'SELECT', 'FROM', 'ADD', 'AS', 'ALL',
'DISTINCT', 'WHERE', 'GROUP', 'BY', 'GROUPING', 'SETS', 'CUBE', 'ROLLUP',
'ORDER', 'HAVING', 'LIMIT', 'AT', 'OR', 'AND', 'IN', NOT, 'NO', 'EXISTS',
'BETWEEN', 'LIKE', RLIKE, 'IS', 'NULL', 'TRUE', 'FALSE', 'NULLS', 'ASC',
'DESC',
== SQL ==
标记 = '标记10'
^^^
但在我将字段名称更改为" ID"并试过
df.filter("ID = '标记10'").show()
有效。
这是在将火花从1.6.1升级到2.1.1之后发生的。
所以我猜这是2.1.1的错误,它不适用于汉字。