使用Spark转换非常大的JSON文件的最快方法是什么?

时间:2016-04-01 21:53:44

标签: scala apache-spark

我有一个包含大量单个JSON对象的相当大的JSON文件(Amazon product data)。那些JSON对象包含我想要为特定训练任务预处理的文本,但这是我需要加速的预处理。一个JSON对象如下所示:

{
  "reviewerID": "A2SUAM1J3GNN3B",
  "asin": "0000013714",
  "reviewerName": "J. McDonald",
  "helpful": [2, 3],
  "reviewText": "I bought this for my husband who plays the piano.  He is having a wonderful time playing these old hymns.  The music  is at times hard to read because we think the book was published for singing from more than playing from.  Great purchase though!",
  "overall": 5.0,
  "summary": "Heavenly Highway Hymns",
  "unixReviewTime": 1252800000,
  "reviewTime": "09 13, 2009"
}

任务是从每个JSON对象中提取reviewText并执行一些预处理,如lemmatizing等。

我的问题是,我不知道如何使用Spark来加速群集上的任务..我实际上甚至不确定我是否可以将JSON文件作为流对象读取 - 主要任务的对象和并行化。

开始使用它的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

由于每行有一个JSON对象,您可以使用RDD的{​​{1}}来获取textFile行。然后使用RDD[String]使用json4s之类的东西解析JSON对象并提取必要的字段。

您的整个代码看起来就像这样简单(假设您mapSparkContext):

sc

答案 1 :(得分:1)

您可以使用JSON数据集,然后执行简单的SQL查询来检索reviewText列的值:

// A JSON dataset is pointed to by path.
// The path can be either a single text file or a directory storing text files.
val path = "path/reviews.json"
val people = sqlContext.read.json(path)
// Register this DataFrame as a table.
people.registerTempTable("reviews")
val reviewTexts = sqlContext.sql("SELECT reviewText FROM reviews")

根据SparkSQL文档(http://spark.apache.org/docs/latest/sql-programming-guide.html#json-datasets

中的示例构建

答案 2 :(得分:-2)

我会将JSON数据加载到Dataframe中,然后选择我需要的字段,也可以使用map来应用像lemmatising这样的预处理。