【问题标题】:Getting keys and values from the rows of an RDD of stringified json [duplicate]从字符串化json的RDD的行中获取键和值[重复]
【发布时间】:2019-05-12 11:40:14
【问题描述】:

我的 RDD 的每一行看起来都像这样:

[{"date":1.533204038E12,"time":1.533204038E12,"num":"KD10617029","type":"item","vat":0}]

我的功能:

def writeToES(data: java.util.List[String]): Unit = {

    val conf: SparkConf = new SparkConf().setAppName("ESWriter").setMaster("local")
    val sc: SparkContext = new SparkContext(conf)
    val sql: SQLContext = new SQLContext(sc)
    val spark: SparkSession = sql.sparkSession
    sc.setLogLevel("ERROR")
    import spark.implicits._

    val dataList = data.toArray()
    //println("datalist size: "+dataList.size)
    val dataDF = sc.parallelize(dataList)
              .map(x=>x.toString)
              .map(x=>x.split(","))
              .map(x=>Row.fromSeq(x))
              .map(x=>x.mkString(",")).toDF()
    dataDF.show()
    dataDF.take(1).toList.foreach(println)
    println(dataDF.take(1).length)
}

如何从列表中的字符串化 json 中获取“键”... 以及如何将每个 json 的值作为 rdd(或数据框)中的一行获取

【问题讨论】:

标签: json scala apache-spark rdd


【解决方案1】:

正如@user238607 所建议的,您可以直接转换字符串。但您也可以直接使用中间 RDD(带有 json 字符串):

val rdd = sparkSession.sparkContext.parallelize(Array("{\"date\":1.533204038E12,\"time\":1.533204038E12,\"num\":\"KD10617029\",\"type\":\"item\",\"vat\":0}"))
val dataframe = sparkSession.read.json(rdd).toDF
dataframe.show()

这会从中间 RDD 创建一个 DataFrame。

+--------------+----------+--------------+----+---+
|          date|       num|          time|type|vat|
+--------------+----------+--------------+----+---+
|1.533204038E12|KD10617029|1.533204038E12|item|  0|
+--------------+----------+--------------+----+---+

对于 Spark >= 2.2.0,json() 函数使用 Dataset 而不是 RDD。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多