ftw*_*ftw 4 apache-spark spark-dataframe
当我在spark-shell(1.6版本)上查询数据帧时,列名称不区分大小写.在Spark-Shell上
val a = sqlContext.read.parquet("<my-location>")
a.filter($"name" <=> "andrew").count()
a.filter($"NamE" <=> "andrew").count()
Run Code Online (Sandbox Code Playgroud)
以上结果都给了我正确的数量.但是当我在jar中构建它并通过"spark-submit"运行时,下面的代码失败,说NamE不存在,因为底层镶木地板数据用列保存为"名称"
失败:
a.filter($"NamE" <=> "andrew").count()
Run Code Online (Sandbox Code Playgroud)
通过:
a.filter($"name" <=> "andrew").count()
Run Code Online (Sandbox Code Playgroud)
我在这里遗漏了什么吗?有没有办法可以让它不区分大小写.我知道我可以在过滤之前使用select并将所有列作为小写别名,但是想知道它为什么表现不同.
Flo*_*iny 10
这里有点棘手:简单的答案是因为你认为你SQLContext
在两种情况下都使用相同的,实际上,你不是.在spark-shell中,为您创建了一个SQLContext,但它实际上是HiveContext
:
scala> sqlContext.getClass
res3: Class[_ <: org.apache.spark.sql.SQLContext] = class org.apache.spark.sql.hive.HiveContext
在你的火花提交中,你可能会使用一个简单的SQLContext
.根据@ LostInOverflow的链接:Hive is case insensitive, while Parquet is not
,所以我的猜测如下:通过使用HiveContext
你可能正在使用与Hive相关的一些代码来下载你的Parquet数据.Hive不区分大小写,它工作正常.用一个简单的SQLContext
,它没有,这是预期的行为.
小智 6
......不区分大小写,而Parquet则不区分大小写
你可以试试:
val b = df.toDF(df.columns.map(_.toLowerCase): _*)
b.filter(...)
Run Code Online (Sandbox Code Playgroud)
尝试使用 sqlContext 显式控制区分大小写。使用以下语句关闭区分大小写并检查它是否有帮助。
sqlContext.sql("set spark.sql.caseSensitive=false")