Выделить все столбцы во время выполнения spark sql, без предопределенной схемы - PullRequest
0 голосов
/ 04 октября 2018

У меня есть фрейм данных со значениями в формате

|resourceId|resourceType|seasonId|seriesId|
+----------+------------+--------+--------+
|1234      |cM-type     |883838  |8838832 |
|1235      |cM-type     |883838  |8838832 |
|1236      |cM-type     |883838  |8838832 |
|1237      |CNN-type    |883838  |8838832 |
|1238      |cM-type     |883838  |8838832 |
+----------+------------+--------+--------+

Я хочу конвертировать фрейм данных в этот формат

+----------+----------------------------------------------------------------------------------------+
|resourceId|value                                                                                   |
+----------+----------------------------------------------------------------------------------------+
|1234      |{"resourceId":"1234","resourceType":"cM-type","seasonId":"883838","seriesId":"8838832"} |
|1235      |{"resourceId":"1235","resourceType":"cM-type","seasonId":"883838","seriesId":"8838832"} |
|1236      |{"resourceId":"1236","resourceType":"cM-type","seasonId":"883838","seriesId":"8838832"} |
|1237      |{"resourceId":"1237","resourceType":"CNN-type","seasonId":"883838","seriesId":"8838832"}|
|1238      |{"resourceId":"1238","resourceType":"cM-type","seasonId":"883838","seriesId":"8838832"} |
+----------+----------------------------------------------------------------------------------------+

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

val jsonformated=df.select($"resourceId",to_json(struct($"resourceId", $"resourceType", $"seasonId",$"seriesId")).alias("value"))

Однако я пытаюсь передать значения столбца в программную структуру, используя

val cols = df.columns.toSeq
val jsonformatted=df.select($"resourceId",to_json(struct("colval",cols)).alias("value"))

, по какой-то причине функция структуры не принимает последовательность,из API, похоже, что есть подпись метода для принятия последовательности,

struct(String colName, scala.collection.Seq<String> colNames)

есть лучшее решение для решения этой проблемы.

Обновление:

КакВ ответе указан точный синтаксис для получения вывода

val colsList = df.columns.toList
 val column: List[Column] = colsList.map(dftrim(_))
 val jsonformatted=df.select($"resourceId",to_json(struct(column:_*)).alias("value"))

1 Ответ

0 голосов
/ 04 октября 2018

struct занимает последовательность.Вы просто смотрите на неправильный вариант.Используйте

def struct(cols: Column*): Column 

, например

import org.apache.spark.sql.functions._

val cols: Seq[String] = ???

struct(cols map col: _*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...