Как разделить массив Json DataFrame на несколько возможных чисел в Scala - PullRequest
0 голосов
/ 31 марта 2020

Как я могу разделить массив Json DataFrame на несколько строк в Spark- Scala

Input DataFrame :

                +----------+-------------+-----------------------------------------------------------------------------------------------------------------------------+
                |item_id   |s_tag  |jsonString                                                                                                                         |
                +----------+-------------+-----------------------------------------------------------------------------------------------------------------------------+
                |Item_12345|S_12345|[{"First":{"Info":"ABCD123","Res":"5.2"}},{"Second":{"Info":"ABCD123","Res":"5.2"}},{"Third":{"Info":"ABCD123","Res":"5.2"}}]      |
                +----------+-------------+-----------------------------------------------------------------------------------------------------------------------------+


            Output DataFrame :
                +----------+-------------------------------------------------+
                |item_id   |s_tag  |jsonString                               |
                +----------+-------------------------------------------------+
                |Item_12345|S_12345|{"First":{"Info":"ABCD123","Res":"5.2"}} |
                +----------+-------------------------------------------------+
                |Item_12345|S_12345|{"Second":{"Info":"ABCD123","Res":"5.2"}}|
                +----------+-------------------------------------------------+
                |Item_12345|S_12345|{"Third":{"Info":"ABCD123","Res":"5.2"}} |
                +----------+-------------------------------------------------+

Это то, что я пробовал до сих пор, но это не сработало

val rawDF = sparkSession
      .sql("select 1")
      .withColumn("item_id", lit("Item_12345")).withColumn("s_tag", lit("S_12345"))
      .withColumn("jsonString", lit("""[{"First":{"Info":"ABCD123","Res":"5.2"}},{"Second":{"Info":"ABCD123","Res":"5.2"}},{"Third":{"Info":"ABCD123","Res":"5.2"}}]""")) 

    val newDF = RawDF.withColumn("splittedJson", explode(RawDF.col("jsonString")))

1 Ответ

2 голосов
/ 31 марта 2020

Проблема в примере кода, который вы разместили, заключается в том, что json представлен в виде строки и, следовательно, не может быть взорван. Попробуйте что-то вроде этого:

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{typedLit, _}


object tmp {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local[1]").getOrCreate()

    val arr = Seq("{\"First\":{\"Info\":\"ABCD123\",\"Res\":\"5.2\"}}",
      "{\"Second\":{\"Info\":\"ABCD123\",\"Res\":\"5.2\"}}",
      "{\"Third\":{\"Info\":\"ABCD123\",\"Res\":\"5.2\"}}")
    val rawDF = spark.sql("select 1")
      .withColumn("item_id", lit("Item_12345"))
      .withColumn("s_tag", lit("S_12345"))
      .withColumn("jsonString", typedLit(arr))
    val newDF = rawDF.withColumn("splittedJson", explode(rawDF.col("jsonString")))

    newDF.show()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...