我正在尝试使用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数据?
答案 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");
然后您就可以开始对算法进行基准测试了。