在表格中,有三列:名称,年龄和详细信息。实施例 -
|名称|年龄|信息|
| A | 12 |" {\"地址\":\" add-1 \",\" pincode \":110011} " |
| B | 35 |" {\"地址\":\" add-2 \",\" state \":\& #34; ny \",\" pincode \":112121}" |
| C | 36 |" {\"地址\":\" add-2 \",\" state \":\& #34; ohio \",\" city \":\" athens \"}" |
该表包含数百万条记录,其中包含"详细信息"列作为序列化的json字符串。 "细节"的性质列本质上是动态的,任何键都可以存在,例如新列,嵌套json。
我想用嵌套json中的字段作为第一类变量创建Java RDD / DataFrame,这样df.printSchema()显示为,
| - name:string(nullable = true)
| - age:long(nullable = true)
| - address:string(nullable = true)
| - state:string(nullable = true)
| - city:string(nullable = true)
| - pincode:long(nullable = true)
| - {new dynamic key}:string(nullable = true)
此架构可以轻松进行聚合。
我编写了以下代码,但无法获得上述必需的架构,
DataFrame df = sqlContext.sql("select name, age, details"); JavaRDD modifiedRDD = df.toJavaRDD().map((Function) row -> { Row modifiedRow = null; if (row != null) { String details = row.getString(2); ObjectMapper mapper = new ObjectMapper(); try { UserInfo userInfo = mapper.readValue(details, UserInfo.class); Map details = userInfo.getDetails(); // TODO create modified RDD using default columns and exploded details map such that keys in map are first level columns i.e. userInfo and keys from details map } catch (IOException e) { e.printStackTrace(); } } return modifiedRow; });
目标是从原始RDD转换为修改后的RDD,在HDFS中保留,然后进行计算,以便可以在同一组修改后的RDD上执行多个聚合。
请建议。