Spark-SQL读取JSON数据速度慢

时间:2018-11-29 02:22:22

标签: java apache-spark apache-spark-sql

我正在尝试使用SparkConf sparkConf = new SparkConf(); sparkConf.setAppName("aaa"); sparkConf.setMaster("local[*]"); JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf); SparkSession sc = SparkSession.builder().sparkContext(javaSparkContext.sc()).getOrCreate(); String data = "{\"temp\":25, \"hum01\":50, \"env\":{\"lux\":1000, \"geo\":[32.5, 43.8]}}"; String querySql = "select env.lux as abc from testData"; System.out.println("start 01, time is"+System.currentTimeMillis()); List<String> dataList = Arrays.asList(data); Dataset<String> dataset = sc.createDataset(dataList, Encoders.STRING()); dataset.printSchema(); System.out.println("start 02, time is"+System.currentTimeMillis()); Dataset<Row> df = sc.read().json(dataset); System.out.println("start 03, time is"+System.currentTimeMillis()); List<String> queryResultJson = null; try{ df.createOrReplaceTempView("testData"); System.out.println("start 04, time is"+System.currentTimeMillis()); Dataset<Row> queryData = sc.sql(querySql); System.out.println("start 05, time is"+System.currentTimeMillis()); queryResultJson = queryData.toJSON().collectAsList(); System.out.println("start 06, time is"+System.currentTimeMillis()); }catch (Exception e) { e.printStackTrace(); } finally { sc.catalog().dropTempView("testData"); } 来读取和选择JSON字符串中的数据。

这是我所做的:

start 01, time is1543457455652
start 02, time is1543457458766
start 03, time is1543457459993
start 04, time is1543457460190
start 05, time is1543457460334
start 06, time is1543457460818

结果如下:

{{1}}

似乎数据集创建过程花费太多时间。我想在流数据处理流程中使用此功能。但是性能太差了,无法使用。

有什么方法可以使数据集创建更快? 还是有其他方法可以使用类似语言的SQL查询Json数据?

1 个答案:

答案 0 :(得分:0)

使用Spark结构化流媒体时,您不会以相同的方式创建数据集。 例如,如果您的源是带有描述数据的架构的套接字:

SparkSession spark = SparkSession.builder()
    .appName("Simple Application")
    .master("local[*]")
    .getOrCreate();
StructType sensorSchema = new StructType().add("temp", new IntegerType())
        .add("hum01", new IntegerType())
        .add("env", new StructType()
                                .add("lux", new IntegerType())
                                .add("geo", new ArrayType(new FloatType(), false)));
Dataset<Row> socketDF = spark
    .readStream()
    .format("socket")
    .option("host", "localhost")
    .option("port", 9999)
    .schema()
    .load()
    .selectExp("temp, hum01, env");

然后您就可以开始对算法进行基准测试了。