首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spark :分解一对嵌套列

Spark :分解一对嵌套列
EN

Stack Overflow用户
提问于 2017-02-22 16:06:30
回答 1查看 4.2K关注 0票数 1

Spark 2.1版

我正在将一个文件读入Spark dataframe,格式如下:

代码语言:javascript
运行
复制
{
    "field1": "value1",
    "field2": "value2",
    "elements": [{
        "id": "1",
        "name": "a"
    },
    {
        "id": "2",
        "name": "b"
    },
    {
        "id": "3",
        "name": "c"
    }]
}

它包含嵌套元素的array,现在我想对elements数组执行explode操作,以获得扁平的json结构。我使用了下面的代码:

代码语言:javascript
运行
复制
var dfExploded = df
    .withColumn("id", 
      explode(df.col("elements.id")))
    .withColumn("name",
      explode(df.col("elements.name")));

它似乎返回笛卡尔乘积(例如,我在结果中得到9个元素,而我只想要3个)。有没有什么方法可以指定一对嵌套列到explode函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-22 16:39:05

如果我理解正确的话,你可以试试这个:

代码语言:javascript
运行
复制
 val exploded = df.withColumn("elements", explode($"elements"))
 exploded.show()
 >> +--------+------+------+
 >> |elements|field1|field2|
 >> +--------+------+------+
 >> |   [1,a]|value1|value2|
 >> |   [2,b]|value1|value2|
 >> |   [3,c]|value1|value2|
 >> +--------+------+------+

第一步基本上将数组转换为单独的记录。您需要对数组本身(元素)执行此操作,而不是对数组内部的元素执行此操作

接下来,您可以执行以下操作

代码语言:javascript
运行
复制
 val flattened = exploded.select("elements.*", "field1", "field2")
 flattened.show()
 >> +---+----+------+------+
 >> | id|name|field1|field2|
 >> +---+----+------+------+
 >> |  1|   a|value1|value2|
 >> |  2|   b|value1|value2|
 >> |  3|   c|value1|value2|
 >> +---+----+------+------+

展平元素的步骤

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42385832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档