【问题标题】:Scala Apache Spark: Nonstandard characters in column namesScala Apache Spark:列名中的非标准字符
【发布时间】:2018-05-15 19:09:53
【问题描述】:

我正在拨打以下电话:

  propertiesDF.select(
        col("timestamp"), col("coordinates")(0) as "lon", 
        col("coordinates")(1) as "lat", 
        col("properties.tide (above mllw)") as "tideAboveMllw",
        col("properties.wind speed") as "windSpeed")

这给了我以下错误:

org.apache.spark.sql.AnalysisException: No such struct field 潮 (高于 mllw)在气温、大气压力、露点、 主波周期、平均波向、名称、程序名称、 有效波高、潮汐(高于 mllw):、能见度、水 温度、风向、风速;

现在肯定有这样一个struct字段。 (错误信息本身就是这么说的。)

这是架构:

 root
 |-- timestamp: long (nullable = true)
 |-- coordinates: array (nullable = true)
 |    |-- element: double (containsNull = true)
 |-- properties: struct (nullable = true)
 |    |-- air temperature: double (nullable = true)
 |    |-- atmospheric pressure: double (nullable = true)
 |    |-- dew point: double (nullable = true)
          .
          .
          .
 |    |-- tide (above mllw):: string (nullable = true)
          .
          .
          .

输入被读取为 JSON,如下所示:

val df = sqlContext.read.json(dirName)

如何处理列名中的括号?

【问题讨论】:

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


    【解决方案1】:

    您应该首先避免使用这样的名称,但您可以拆分访问路径:

    val df = spark.range(1).select(struct(
      lit(123).as("tide (above mllw)"),
      lit(1).as("wind speed")
    ).as("properties"))
    
    df.select(col("properties").getItem("tide (above mllw)"))
    
    // or
    
    df.select(col("properties")("tide (above mllw)"))
    

    或用反引号括起来有问题的字段:

    df.select(col("properties.`tide (above mllw)`"))
    

    两种解决方案都假定您的数据包含以下结构(基于您用于查询的访问路径):

    df.printSchema
    // root
    //  |-- properties: struct (nullable = false)
    //  |    |-- tide (above mllw): integer (nullable = false)
    //  |    |-- wind speed: integer (nullable = false)
    

    【讨论】:

    • 您的第一个解决方案是给我这个错误:线程“主”org.apache.spark.sql.AnalysisException 中的异常:气温、大气压力、露水中没有这样的结构域潮汐(高于 mllw)点、主导波周期、平均波向、名称、程序名称、有效波高、潮汐(高于 mllw):、能见度、水温、风向、风速
    • 您的第二个解决方案是给我这个错误:线程“主”org.apache.spark.sql.AnalysisException 中的异常:气温、大气压力、露水中没有这样的结构域潮汐(高于 mllw)点、主导波周期、平均波向、名称、程序名称、有效波高、潮汐(高于 mllw):、能见度、水温、风向、风速;
    • 您的第三个解决方案是给我这个错误:org.apache.spark.sql.AnalysisException:在气温、大气压力、露点、主导波周期中没有这样的结构场潮(高于 mllw),平均波向、名称、程序名称、有效波高、潮汐(高于 mllw):、能见度、水温、风向、风速;
    • tide (above mllw): 后面好像多了个: 是不是笔误?
    • 只是省略号表示有更多的字段。这不是错字。
    【解决方案2】:

    基于the documentation,您可以尝试使用单引号。像这样:

     propertiesDF.select(
            col("timestamp"), col("coordinates")(0) as "lon", 
            col("coordinates")(1) as "lat", 
            col("'properties.tide (above mllw)'") as "tideAboveMllw",
            col("properties.wind speed") as "windSpeed")
    

    【讨论】:

    • 你的建议给了我这个错误:org.apache.spark.sql.AnalysisException: Cannot resolve column name "'properties.tide (above mllw)'" 在(时间戳,坐标,属性)
    • 好的,抱歉。 TBH 一开始我什至无法重现该错误。
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2023-04-01
    • 2014-08-25
    • 2014-05-15
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多