我在Spark中导入了一个json文件,并将其转换为
表格myDF.registerTempTable("myDF")
然后我想在这个结果表上运行SQL查询
val newTable = sqlContext.sql("select column-1 from myDF")
然而,由于列column-1
的名称中的超赞,这给了我一个错误。我如何解决这个问题是Spark SQL?
答案 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 names
是 YYYY-MM
列,Spark
将解析为表达式,分别生成 2011
和 2010
。