如何将spark数据帧转换为JSON格式的http响应



我的用例如下。当HTTP端点被击中时,它将读取Parquet文件,转换为Spark数据帧/其他框架数据帧,运行一些简单的处理并以JSON格式输出响应。

已编辑添加数据集-它们的范围从小于100行*10列的小数据集到大于500000行*20列的中等数据集,列值为文本和数字对其他建议持开放态度。我在试箭,火花。

我尝试了dataset.write,它写入文件。我想知道是否有办法将其转换为

  1. JSON字符串,可能是某种映射程序
  2. 直接流到HTTP输出流

或者我不应该使用Spark?

Dataset中有很多方法可以收集驱动程序上的所有数据,而不是write(collect、collectAsList、toLocalIterator-spark javadoc(。只是不要忘记,你的所有数据都应该放在驱动程序内存中,否则你会OOM。

在收集了驱动程序上所需的所有数据后,您可以将其作为任何java对象进行处理(例如,将其序列化为JSON(,并作为响应发送。

以下是的示例

List<Row> rows = new ArrayList<>();
rows.add(RowFactory.create("1", "name"));
rows.add(RowFactory.create("2", "name2"));
rows.add(RowFactory.create("3", "name3"));
StructType schema = new StructType();
schema = schema.add("id", DataTypes.StringType, false);
schema = schema.add("name", DataTypes.StringType, false);
Dataset<Row> df = spark.createDataFrame(rows, schema);
List<String> res = df.withColumn(
"struct",
functions.struct(functions.col("id"), functions.col("name"))
).withColumn(
"json",
functions.to_json(functions.col("struct"))
).select("json").collectAsList().stream().map(
row -> row.getString(0)
).collect(Collectors.toList());

最新更新