【问题标题】:Apache Pig: Dynamic columnsApache Pig:动态列
【发布时间】:2014-11-11 14:05:05
【问题描述】:

我有一个数据集 (CSV),其中包含三个值列(v1、2 和 3)和一个值。值的描述以逗号分隔的字符串形式存储在“keys”列中。

| v1 | v2 | v3 | keys  |
| A  | C  | E  | X,Y,Z |

使用 Pig 我想将此信息加载到 HBase 表中,其中列族为 C,列限定符是键。

| C:X | C:Y | C:Z |
| A   | C   | E   |

以前有没有人这样做过并愿意分享这些知识?

另一种选择是将映射(key#value)存储在 HBase 列中。但是我不确定这对于查询数据是否灵活?

【问题讨论】:

    标签: hbase apache-pig


    【解决方案1】:

    这是处理多结构架构时的常见问题。如果您真的想尝试使用 MAP 类型,那么这是一个坏主意。

    你可以用 MapReduce 试试这个。 MapReduce 是最好的解决方案。

    【讨论】:

    • 感谢您的回答。你有机会提供更多细节或例子吗?
    • 你想要 MapReduce 示例吗?
    • 我还是更喜欢在 pig 中解决它,但我会试试 MR。你有例子吗?
    【解决方案2】:

    找到解决我问题的方法

    test.pig:

    REGISTER data.py using jython as myfuncs
    
    A = LOAD 'data' using PigStorage('|') AS (
        id:chararray,
        date:chararray,
        v1:chararray,
        v2:chararray,
        v3:chararray,
        keys:chararray,
    );
    
    B = FOREACH A {
    GENERATE
        id,
        date,
        myfuncs.dataToMap(STRSPLIT(keys, ','), TOTUPLE(v1, v2, v3)) as kv;
    }
    
    STORE B INTO 'pig_table' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage( 'e:date kv:*' );
    

    data.py:

    import org.apache.pig.data.DataType as DataType
    import org.apache.pig.impl.logicalLayer.schema.SchemaUtil as SchemaUtil
    
    @outputSchema("ud:map[]")
    def dataToMap(keys, values):
    
    result = dict()
    keys = list(keys)
    values = list(values)
    
    try:
        while True:
            values.remove(None)
    except ValueError:
        pass
    
    for idx in range(len(keys)):
        result[keys[idx]] = values[idx]
    
    return result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多