如何在Spark SQL中使用连字符转义列名

时间:2015-06-17 11:00:03

标签: scala apache-spark apache-spark-sql

我在Spark中导入了一个json文件,并将其转换为

表格
myDF.registerTempTable("myDF")

然后我想在这个结果表上运行SQL查询

val newTable = sqlContext.sql("select column-1 from myDF")

然而,由于列column-1的名称中的超赞,这给了我一个错误。我如何解决这个问题是Spark SQL?

4 个答案:

答案 0 :(得分:38)

反引号(`)似乎有效,所以

val newTable = sqlContext.sql("select `column-1` from myDF")

应该这样做,至少在Spark v1.3.x中。

答案 1 :(得分:3)

昨天对它有点了,原来有一种方法可以逃避(:)和(。)这样:

只有包含(:)的字段需要使用反引号进行转义

sqlc.select("select `sn2:AnyAddRq`.AnyInfo.noInfo.someRef.myInfo.someData.Name AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show()

答案 2 :(得分:1)

我不能发表评论,因为我的代表不到50次

使用struct.struct.field引用json结构时,存在如下命名空间:

ns2:struct.struct.field反引号(`)不起作用。

jsonDF = sqlc.read.load('jsonMsgs', format="json")
jsonDF.registerTempTable("masterTable")
sqlc.select("select `sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name` AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show()

pyspark.sql.utils.AnalysisException:你"无法解决' sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name'

如果我删除sn2:字段,则执行查询。

我也试过单引号('),反斜杠(\)和双引号("")

如果我在sn2:strucutre上注册另一个临时表,它的唯一方法就是这样工作,我可以像这样访问其中的字段

anotherDF = jsonDF.select("sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData")
anotherDF.registerTempTable("anotherDF")
sqlc.select("select Name from anotherDF").show()

答案 3 :(得分:0)

这就是我所做的,它也适用于 Spark 3.x

我在程序顶部(或在某些 litCol() 中)定义了函数 global scope

litCols = lambda seq: ','.join(('`'+x+'`' for x in seq)) # Accepts any sequence of strings.

然后根据需要应用它来准备我的文字化 SELECT 列。举个例子:

>>> UNPROTECTED_COLS = ["RegionName", "StateName", "2012-01", "2012-02"]
>>> LITERALIZED_COLS = litCols(UNPROTECTED_COLS)
>>> print(LITERALIZED_COLS)
`RegionName`,`StateName`,`2012-01`,`2012-02`

此示例中的问题 column namesYYYY-MM 列,Spark 将解析为表达式,分别生成 20112010