【问题标题】:How to get Apache spark to ignore dots in a query?如何让 Apache spark 忽略查询中的点?
【发布时间】:2016-10-03 19:29:20
【问题描述】:

给定以下 JSON 文件:

[{"dog*woof":"bad dog 1","dog.woof":"bad dog 32"}]

为什么这段 Java 代码会失败:

DataFrame df = sqlContext.read().json("dogfile.json");
df.groupBy("dog.woof").count().show();

但这不是:

DataFrame df = sqlContext.read().json("dogfile.json");
df.groupBy("dog*woof").count().show();

这是一个sn-p的失败:

 Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'dog.woof' given input columns: [dog*woof, dog.woof];
    at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57)
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:335)
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:335)
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:69)
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:334)
...

【问题讨论】:

    标签: java json apache-spark


    【解决方案1】:

    它失败了,因为点用于访问struct 字段的属性。您可以使用反引号转义列名:

    val df = sqlContext.read.json(sc.parallelize(Seq(
       """{"dog*woof":"bad dog 1","dog.woof":"bad dog 32"}"""
    )))
    
    df.groupBy("`dog.woof`").count.show
    // +----------+-----+
    // |  dog.woof|count|
    // +----------+-----+
    // |bad dog 32|    1|
    // +----------+-----+
    

    但在名称中使用特殊字符不是一个好习惯,一般都可以使用。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2022-11-28
      相关资源
      最近更新 更多