【问题标题】: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?

【问题讨论】:

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


    【解决方案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|
    +--------+
    

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多