Spark SparkSession是否支持带有中文字符的csv文件?

时间:2017-02-17 08:53:34

标签: apache-spark-sql

我有一个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 个答案:

答案 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的错误,它不适用于汉字。