Spark Sparksession支持CSV文件,并在归档名称中使用中文字符



我有一个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的错误,并且剂量不适用于汉字。

最新更新