【问题标题】:DataFrame to Json Array in SparkSpark中的DataFrame到Json数组
【发布时间】:2017-12-21 20:30:46
【问题描述】:

我正在用 Java 编写 Spark 应用程序,它读取 HiveTable 并将输出作为 Json 格式存储在 HDFS 中。

我使用HiveContext 读取了配置单元表,它返回了DataFrame。下面是代码sn-p。

 SparkConf conf = new SparkConf().setAppName("App");
 JavaSparkContext sc = new JavaSparkContext(conf);
 HiveContext hiveContext = new org.apache.spark.sql.hive.HiveContext(sc);

DataFrame data1= hiveContext.sql("select * from tableName")

现在我想将DataFrame 转换为JsonArray。例如,data1 数据如下所示

|  A  |     B     |
-------------------
|  1  | test      |
|  2  | mytest    |

我需要像下面这样的输出

[{1:"test"},{2:"mytest"}]

我尝试使用data1.schema.json(),它给了我如下输出,而不是数组。

{1:"test"}
{2:"mytest"}

在不使用任何第三方库的情况下将DataFrame 转换为jsonArray 的正确方法或功能是什么。

【问题讨论】:

    标签: java arrays json apache-spark


    【解决方案1】:

    data1.schema.json 将为您提供一个 JSON 字符串,其中包含数据框的架构,而不是实际数据本身。你会得到:

    String = {"type":"struct",
              "fields":
                      [{"name":"A","type":"integer","nullable":false,"metadata":{}},
                      {"name":"B","type":"string","nullable":true,"metadata":{}}]}
    

    要将您的数据框转换为 JSON 数组,您需要使用数据框的toJSON 方法:

    val df = sc.parallelize(Array( (1, "test"), (2, "mytest") )).toDF("A", "B")
    df.show()
    
    +---+------+
    |  A|     B|
    +---+------+
    |  1|  test|
    |  2|mytest|
    +---+------+
    
    df.toJSON.collect.mkString("[", "," , "]" )
    String = [{"A":1,"B":"test"},{"A":2,"B":"mytest"}]
    

    【讨论】:

    • 在 Java 中,mkString 不起作用。 toString() 不会得到任何参数。
    • 如果你使用的是 Java 8,你可以使用StringJoiner
    【解决方案2】:

    在 JAVA 中可以通过以下方式实现:

    String jsonToReturn = df.toJSON().collectAsList().toString();
    reutrn jsonToReturn;
    

    如果是服务器端,则return 将其作为response

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 2019-05-16
      • 2018-10-05
      • 2020-01-15
      • 2018-10-16
      • 2018-01-11
      • 1970-01-01
      • 2022-11-22
      • 2019-11-30
      相关资源
      最近更新 更多