将多行旋转到具有多个列的行中(如在R中重塑形状)

时间:2014-11-13 23:20:21

标签: mysql hive

我有一个表,其中包含每个产品的数据,它们具有某些属性,比如说(现在仅限于A,B,C)。我有与每个属性对应的值。

Product Attribute Value
p1  A  1
p1  B  2
p1  C  3
p2  A  1
p3  B  3
p3  C  2

我希望我的输出为:

Product    A     B    C
1          1     2    3
2          1     NULL NULL
3          NULL  3    2

我到目前为止所尝试的是它确实给了我最终想要的东西,但这个查询完全是一个大块,我来自R背景,我想知道他们是一个简单的解决方案或类似的东西像来自cast的{​​{1}}来自

谢谢!

reshape

1 个答案:

答案 0 :(得分:1)

我不知道Hive中的pivot功能,但这是可能的。您需要收集地图的属性和值,这可以使用此UDAF

来完成

示例:

ADD JAR /root/path/to/jar/brickhouse-0.7.0.jar;
CREATE TEMPORARY FUNCTION collect AS 'brickhouse.udf.collect.CollectUDAF';

SELECT product
    , attr_map['A'] AS A
    , attr_map['B'] AS B
    , attr_map['C'] AS C
FROM (
    SELECT product
        , collect(attribute, value) AS attr_map
    FROM test
    GROUP BY product
    ) x

这里需要注意的是,如果你有很多属性,这可能是相当多的重复代码。