2016-06-10 4 views
0

Я пытаюсь выбрать несколько столбцов из фреймворка (язык scala). Проблема в том, что я не могу поместить все столбцы в одну строку и перейти к функции выбора DataFrame. Я попытался следующие, но он не работает:Spark DataFrame AnalysisException

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 правильно разрешающие «суммы ("bal1")/100, сумма ("bal2")/100 ». Пожалуйста, дайте мне знать, как разрешить исключение AnalysiseException.

Пожалуйста, дайте мне знать, если требуется дополнительная информация. Заранее спасибо.

+0

Можете ли вы дать образец ваших данных и желаемый результат? Не совсем понятно, что вы делаете! – eliasah

ответ

0

Spark API не поддерживает передачу нескольких выражений одновременно в одной строке.

Кроме того, некоторые части ввода должны быть изменены, а также:

  • метод «выбрать» работает с типами Спарк API, а не строк. Вместо этого рассмотрите «selectExpr».
  • Не нужно обертывать имена столбцов в двойных кавычках.

Тем не менее, следующее может быть сделано, по крайней мере, двумя различными способами:

1) Замена «выберите» «с помощью метода selectExpr», и передавая каждый выступ по отдельности. Например:

peopleDataFrame.selectExpr("sum(bal1)/100", "sum(bal2)/100").show 
Метод

См selectExpr из DataFrame API для получения дополнительной информации: 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()