为了让解决方案更直观,示例 json 数据如下所示:
{"id":4,"score":358,"viewCount":24247,"answerCount":13,"commentCount":1,"favoriteCount":28,"tags":["c#","winforms", "类型转换","不透明度"]}
下面是 Java 代码 sn-p 将 json 数据读取为“DataFrame”对象:
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
String jsonData = "{\"id\":4,\"score\":358,\"viewCount\":24247,\"tags\":[\"c#\",\"winforms\",\"类型转换\",\"不透明度\"]}";
列表数据集 = Arrays.asList(jsonData);
JavaRDD distData = sc.parallelize(dataSet);
DataFrame stackoverflow_Posts = sqlContext.read().json(distData);
stackoverflow_Posts.printSchema(); //让我们打印出 DataFrame 模式(输出#1)
stackoverflow_Posts.show(); //让我们显示DataFrame内容(输出#2)
架构:输出#1 如下所示:
根
|-- id: long (可为空 = true)
|-- 得分:长(可为空=真)
|--
标签:数组(可为空=真)
| |-- 元素:字符串(包含Null = true)
|-- viewCount: long (nullable = true)
数据:输出#2如下所示:
+----+-----+--------+---------+
| id|分数|标签|查看次数|
+----+-----+--------+---------+
| 4| 358|[c#,winforms,ty...| 24247|
+----+-----+--------+---------+
根据zero323的信息,我继续处理:
DataFrame 扩展 = stackoverflow_Posts.withColumn("tag", org.apache.spark.sql.functions.explode(stackoverflow_Posts.col("tags")));
扩展的.printSchema(); //让我们再次打印出 DataFrame 模式(输出#3)
展开.show(); //让我们显示DataFrame内容(输出#4)
架构:输出#3如下所示:
根
|-- id: long (可为空 = true)
|-- 得分:长(可为空=真)
|-- 标签:数组(可为空=真)
| |-- 元素:字符串(包含Null = true)
|-- viewCount: long (nullable = true)
|--
标签:字符串(可为空=真)
explode之后的数据:Output#4
+----+-----+--------+---------+-------- --------+
| id|分数|标签|查看次数|标签|
+----+-----+--------+---------+-------- --------+
| 4| 358|[c#,winforms,ty...| 24247| c#|
| 4| 358|[c#,winforms,ty...| 24247|表格|
| 4| 358|[c#,winforms,ty...| 24247|类型转换|
| 4| 358|[c#,winforms,ty...| 24247|不透明度|
+----+-----+--------+---------+-------- --------+
结果看起来非常相似,就像使用 SQL 连接两个表。