如何使用包含“$”的列名进行查询?

Posted

技术标签:

【中文标题】如何使用包含“$”的列名进行查询?【英文标题】:How to query using column names that include "$"? 【发布时间】:2017-03-06 01:59:32 【问题描述】:

在 Spark SQL 中,我可以使用

val spark = SparkSession
      .builder()
      .appName("SparkSessionZipsExample")
      .master("local")
      .config("spark.sql.warehouse.dir", "warehouseLocation-value")
      .getOrCreate()

val df = spark.read.json("source/myRecords.json")
df.createOrReplaceTempView("shipment")
val sqlDF = spark.sql("SELECT * FROM shipment")

从“myRecords.json”中获取数据,这个json文件的结构是:

df.printSchema()
root
 |-- _id: struct (nullable = true)
 |    |-- $oid: string (nullable = true)
 |-- container: struct (nullable = true)
 |    |-- barcode: string (nullable = true)
 |    |-- code: string (nullable = true)

我可以得到这个json的具体列如:

val sqlDF = spark.sql("SELECT container.barcode, container.code FROM shipment")

但是我怎样才能从这个 json 文件中获取 id.$oid 呢? 我试过"SELECT id.$oid FROM shipment_log""SELECT id.\$oid FROM shipment_log",但根本不起作用。 错误信息:

 error: invalid escape character

谁能告诉我如何获得id.$oid

【问题讨论】:

【参考方案1】:

反引号是你的朋友:

spark.read.json(sc.parallelize(Seq(
  """"_id": "$oid": "foo"""")
)).createOrReplaceTempView("df")

spark.sql("SELECT _id.`$oid` FROM df").show
+----+
|$oid|
+----+
| foo|
+----+

DataFrame API:

spark.table("df").select($"_id".getItem("$oid")).show
+--------+
|_id.$oid|
+--------+
|     foo|
+--------+

spark.table("df").select($"_id.$$oid")
+--------+
|_id.$oid|
+--------+
|     foo|
+--------+

【讨论】:

以上是关于如何使用包含“$”的列名进行查询?的主要内容,如果未能解决你的问题,请参考以下文章

R data.table:如何使用包含列名的 R 变量?

如何通过列名的前缀对火花数据框进行子集化?

如何从直线查询结果中的列名中删除表名

如何在 sequelize 查询中使用查询参数作为列名

如何在 django 的插入查询中动态使用列名

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy