我有一个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支持汉字吗?如果是,我应该如何更改我的代码?
谢谢。
我遇到了同样的问题。我有数据集:
标记,值
标记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的错误,并且剂量不适用于汉字。