【问题标题】:Apache SparkSQL unable to resolve given input columns that are created within the sqlTextApache SparkSQL 无法解析在 sqlText 中创建的给定输入列
【发布时间】:2020-12-12 08:40:16
【问题描述】:

我正在尝试运行 spark sql 语句并尝试在进行聚合的同时进行简单的分组;它抱怨在我在模式中提供的给定输入列中找不到列月,但是按照教程,他们能够运行给定的代码。

代码:

    StructField[] fields = new StructField[]{
            new StructField("level", DataTypes.StringType, false, Metadata.empty()),
            new StructField("datetime", DataTypes.StringType, false, Metadata.empty())
    };

    StructType schema = new StructType(fields);
    Dataset<Row> dateSet = spark.createDataFrame(inMemory, schema);
    dateSet.createOrReplaceTempView("logging_level");
    Dataset<Row> results = spark.sql("select level, date_format(datetime, 'MMMM') as month, count(1) as total from logging_level group by level, month");

堆栈跟踪:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`month`' given input columns: [level, datetime]; line 1 pos 107
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:77)
at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:74)....

【问题讨论】:

    标签: java sql apache-spark group-by count


    【解决方案1】:

    您不能在group by 子句中重用在select 子句中定义的别名。您需要重复表达式:

    select level, date_format(datetime, 'MMMM') as month, count(*) as total 
    from logging_level 
    group by level, date_format(datetime, 'MMMM')
    

    请注意,我将count(1) 替换为count(*):它更有效,并且给您相同的结果。

    许多数据库都支持位置参数。我认为 Spark 就是其中之一,所以:

    select level, date_format(datetime, 'MMMM') as month, count(*) as total 
    from logging_level 
    group by 1, 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多