2016-06-14 2 views
1

Мое требование - передать dataframe в качестве входного параметра классу scala, который сохраняет данные в формате json в hdfs.sparksql Преобразование dataframe в json

параметра

входа выглядит следующим образом:

case class ReportA(
        parm1: String, 
        parm2: String, 
        parm3: Double, 
        parm4: Double, 
        parm5: DataFrame 
       ) 

Я создал объект JSON для этого параметра, как:

def write(xx: ReportA) = JsObject(
     "field1" -> JsString(xx.parm1), 
     "field2" -> JsString(xx.parm2), 
     "field3" -> JsNumber(xx.parm3), 
     "field4" -> JsNumber(xx.parm4), 
     "field5" -> JsArray(xx.parm5) 
    ) 

parm5 является dataframe и хотел преобразовать в Json массива.

Как я могу преобразовать dataframe в массив Json?

Благодарим за помощь!

+0

Вы видите метод Json из приведенного ниже https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrame.html? –

ответ

2

DataFrame можно рассматривать как эквивалент простой таблицы в базе данных с строками и столбцами. Вы не можете просто получить простой массив из него, ближе вы woud прийти в массив будет со следующей структурой:

[ 
    "col1": [val1, val2, ..], 
    "col2": [val3, val4, ..], 
    "col3": [val5, val6, ..] 
] 

Для достижения аналогичной структуры, можно использовать toJSON метод DataFrame API чтобы получить RDD<String>, а затем сделать collect (обратите внимание на любые OutOfMemory исключений).

У вас теперь есть Array[String], который вы можете просто преобразовать в JsonArray в зависимости от используемой вами библиотеки JSON.

Остерегайтесь, однако, это похоже на действительно причудливый способ использования Spark, вы вообще не выводите и не трансформируете RDD или DataFrame прямо в один из ваших объектов, вы обычно выливаете его на решение для хранения.

+1

Примечание: Я думаю, что метод называется 'toJSON' (с JSON во всех кепках). –

+0

@ JoshRosen Действительно, я обновил свой ответ, спасибо, что указали это! –

Смежные вопросы