Сводная таблица данных Apache Spark Scala - ошибка синтаксиса SQL

LucieCBurgess спросил: 14 ноября 2017 в 05:37 в: sql

Используя Apache Spark 2.2.0 / Scala, я использую следующий вопрос в качестве руководства для поворота фрейма данных без использования функции pivot: Транспонирование фрейма данных с использованием Spark Scala без использования функции Pivot

Мне нужно повернуть фрейм данных без использования функции pivot, поскольку у меня есть нечисловые данные, а df.pivot работает только с функцией агрегирования, такой как sum, min, max для числовых данных.

Вот мои данные:

+---+-------------+-----------+-------------+-----------+----------+
|Qid |Question    |AnswerText |ParticipantID|Assessment |GeoTag    |
+---+-------------+-----------+-------------+-----------+----------+
|1  |Question1Text|Yes        |abcde1       |0          |(x1,y1)   |
|2  |Question2Text|No         |abcde1       |0          |(x1,y1)   |
|3  |Question3Text|3          |abcde1       |0          |(x1,y1)   |
|1  |Question1Text|No         |abcde2       |0          |(x2,y2)   |
|2  |Question1Text|Yes        |abcde2       |0          |(x2,y2)    |

Я хочу, чтобы это выглядело так:

+-------------+-----------+----------+-------+-----+----- +
|ParticipantID|Assessment |GeoTag    |Qid_1  |Qid_2|Qid_3 |
+-------------+-----------+----------+-------+-----+------+
|abcde1       |0          |(x1,y1)   |Yes    |No   |3     |
|abcde2       |0          |(x2,y2)   |No     |Yes  |Null  |
+-------------+-----------+----------+-------+-----+------+

Я пробовал это:

val questions: Array[String] = df.select("Q_id")
      .distinct()
      .collect()
      .map(_.getAs[String]("Q_id"))
      .sortWith(_<_)val df2: DataFrame = questions.foldLeft(df) {
      case (data, question) => data.selectExpr("*", s"IF(Q_id = '$question', AnswerText, 0) AS $question")
    }

[с последующим выражением GroupBy]

Но я получить следующую ошибку, которая должна быть как-то связана с синтаксисом финального оператора AS $question

17/12/08 16:13:12 INFO SparkSqlParser: Parsing command: *
17/12/08 16:13:12 INFO SparkSqlParser: Parsing command: IF(Q_id_string_new_2 = '101_Who_is_with_you_right_now?', AnswerText, 0) AS 101_Who_is_with_you_right_now?extraneous input '?' expecting <EOF>(line 1, pos 104)== SQL ==
IF(Q_id_string_new_2 = '101_Who_is_with_you_right_now?', AnswerText, 0) AS 101_Who_is_with_you_right_now?
--------------------------------------------------------------------------------------------------------^^^org.apache.spark.sql.catalyst.parser.ParseException: 
extraneous input '?' expecting <EOF>(line 1, pos 104)== SQL ==
IF(Q_id_string_new_2 = '101_Who_is_with_you_right_now?', AnswerText, 0) AS 101_Who_is_with_you_right_now?
--------------------------------------------------------------------------------------------------------^^^    at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:217)

Есть идеи, где я ошибаюсь? есть лучший способ? Я подумал о том, чтобы вернуться к Pandas и Python за пределами Spark, если это необходимо, но я бы лучше написал весь код в той же самой среде, если это возможно. Спасибо за вашу помощь!

0 ответов