我正在使用spark 1.5.0。
我在s3上有一组包含序列文件格式的json数据的文件,价值约为60GB。我必须对此数据集发出大约40个查询并将结果存储回s3。
select a,b,c from t where event_type='alpha'
,select x,y,z from t where event_type='beta'
等。a
可能会丢失。因此,选择a
的第一个查询将失败。为了避免这种情况,我为每个event_type
定义了模式。因此,对于event_type alpha
,架构将类似于{"a": "", "b": "", c:"", event_type=""}
我正在使用以下代码:
JavaPairRDD<LongWritable,BytesWritable> inputRDD = jsc.sequenceFile(bucket, LongWritable.class, BytesWritable.class);
JavaRDD<String> events = inputRDD.map(
new Function<Tuple2<LongWritable,BytesWritable>, String>() {
public String call(Tuple2<LongWritable,BytesWritable> tuple) throws JSONException, UnsupportedEncodingException {
String valueAsString = new String(tuple._2.getBytes(), "UTF-8");
JSONObject data = new JSONObject(valueAsString);
JSONObject payload = new JSONObject(data.getString("payload"));
return payload.toString();
}
}
);
events.cache();
for (String event_type: events_list) {
String query = //read query from another s3 file event_type.query
String jsonSchemaString = //read schema from another s3 file event_type.json
List<String> jsonSchema = Arrays.asList(jsonSchemaString);
JavaRDD<String> jsonSchemaRDD = jsc.parallelize(jsonSchema);
DataFrame df_schema = sqlContext.read().option("header", "true").json(jsonSchemaRDD);
StructType schema = df_schema.schema();
DataFrame df_query = sqlContext.read().schema(schema).option("header", "true").json(events);
df_query.registerTempTable(tableName);
DataFrame df_results = sqlContext.sql(query);
df_results.write().format("com.databricks.spark.csv").save("s3n://some_location);
}
此代码效率非常低,运行大约需要6-8小时。如何优化我的代码?
我应该尝试使用HiveContext。
我认为当前的代码正在对数据进行多次传递,但不确定,因为我已经缓存了RDD?如果是这样,我怎么能一次性完成呢。