在Spark中将DataFrame转换为Json数组

5

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

我使用来读取hive表格,它会返回DataFrame。以下是代码片段:

 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

2个回答

9

data1.schema.json 将为您提供一个包含数据框架模式的 JSON 字符串,而不是实际数据本身。您将获得:

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

要将您的数据框转换为JSON数组,您需要使用DataFrame的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()不会获取任何参数。 - user2731629
1
如果您正在使用Java 8,您可以使用StringJoiner - philantrovert

1
在JAVA中,您可以使用以下方式进行操作:
String jsonToReturn = df.toJSON().collectAsList().toString();
reutrn jsonToReturn;

如果是服务器端,将其作为响应并使用return返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接