使用Spark 1.4.1为嵌套的gz文件拆分数据框列的内容

时间:2016-03-25 00:36:07

标签: scala apache-spark dataframe

我很难使用Spark 1.4.1为嵌套的gz文件拆分数据帧列的内容。我使用map函数来映射gz文件的属性。

数据采用以下格式:

 "id": "tag:1234,89898",
 "actor":
 {
    "objectType": "person",
    "id": "id:1234",
    "link": "http:\wwww.1234.com/"
},
"body",

我使用以下代码拆分列并读取数据文件。

val dataframe= sc.textFile(("filename.dat.gz")
                 .toString())
                 .map(_.split(","))
                 .map(r => {(r(0), r(1),r(2))})
                 .toDF()

dataframe.printSchema()

但结果如下:

 root
 --- _1: string (nullable = true)
 --- _2: string (nullable = true)
 --- _3: string (nullable = true)

这是不正确的格式。我希望架构采用以下格式:

----- id
----- actor
      ---objectType
      ---id
      ---link
-----body

我做错了什么?我需要使用此代码对我的数据集进行一些处理并应用一些转换。

1 个答案:

答案 0 :(得分:0)

此数据类似于JSON。幸运的是,Spark支持使用Spark SQL轻松获取JSON数据。来自Spark Documentation

  

Spark SQL可以自动推断JSON数据集的架构并将其作为DataFrame加载。可以在String的RDD或JSON文件上使用SQLContext.read.json()完​​成此转换。

以下是文档

中示例的修改版本
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val myData = sc.textFile("myPath").map(s -> makeValidJSON(s))
val myNewData = sqlContext.read.json(myData)

// The inferred schema can be visualized using the printSchema() method.
myNewData.printSchema()

对于makeValidJSON函数,您只需要专注于一些字符串解析/操作策略以使其正确。

希望这有帮助。