【问题标题】:Spark DataFrame AnalysisExceptionSpark DataFrame 分析异常
【发布时间】:2016-10-10 22:58:00
【问题描述】:

我正在尝试从数据框(scala 语言)中选择几列。 问题是,我无法将所有列放入单个字符串并传递给 DataFrame 的 select 函数。我尝试了以下方法,但它不起作用:

scala> val str1 = "sum(\"bal1\")/100,"
str1: String = sum("bal1")/100,

scala> val str2 = "sum(\"bal12\")/100,"
str1: String = sum("bal2")/100,

scala> val str3 = str1.concat(str2)
str3: String = sum("bal1")/100,sum("bal2")/100

peopleDataFrame.select(str3).show // Throws AnalysisException as mentioned below

scala> peopleDataFrame.select(str3).show
org.apache.spark.sql.AnalysisException: cannot resolve 'sum("bal1")/100,sum("bal2")/100' given input columns name, bal1, bal2;

完整代码片段:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val people = sc.textFile("hdfs://quickstart.cloudera:8020/user/sekar/1.txt")
val schemaString = "name,bal1,bal2"
import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.{StructType,StructField,IntegerType};
val schema =
  StructType(
    schemaString.split(",").map(fieldName => StructField(fieldName, IntegerType, true)))
val rowRDD = people.map(_.split(",")).map(p => Row(p(0).toString, p(1).toInt, p(2).toInt))  
val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)

scala> val str1 = "sum(\"bal1\")/100,"
str1: String = sum("bal1")/100,

scala> val str2 = "sum(\"bal12\")/100,"
str1: String = sum("bal2")/100,

scala> val str3 = str1.concat(str2)
str3: String = sum("bal1")/100,sum("bal2")/100

peopleDataFrame.select(str3).show

str3 正确解析为 'sum("bal1")/100,sum("bal2")/100'。请让我知道如何解决 AnalysiseException。

如果需要更多信息,请告诉我。提前致谢。

【问题讨论】:

  • 您能否提供数据样本和所需的输出?不清楚你在做什么!

标签: scala apache-spark


【解决方案1】:

Spark API 不支持在同一个字符串中同时传递多个表达式。

此外,输入的某些部分也应更改:

  • 'select' 方法适用于 Spark API 类型,而不是字符串。请考虑使用“selectExpr”。
  • 无需将列名用双引号括起来。

也就是说,至少可以通过两种不同的方式完成以下操作:

1) 将 'select' 替换为 'selectExpr' 方法,并分别传递每个投影。 例如:

peopleDataFrame.selectExpr("sum(bal1) / 100", "sum(bal2) / 100").show

请参阅 DataFrame API 中的 selectExpr 方法以获取更多信息: https://spark.apache.org/docs/1.6.1/api/scala/#org.apache.spark.sql.DataFrame

2) 将数据框注册为临时表,并直接执行 SQL(如果投影来自外部,这可能很有用)

peopleDataFrame.registerTempTable("peopleDataFrame")
sqlContext.sql("SELECT sum(bal1) / 100, sum(bal2) / 100 FROM peopleDataFrame").show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多