apache pig:动态列

ivqmmu1c  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(343)

我有一个数据集(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   |

以前有没有人这样做过,并且愿意分享这些知识?
另一种选择是在hbase列中存储map(key#value)。但我不确定这对于查询数据是否灵活?

jfgube3f

jfgube3f1#

找到了解决我问题的办法
试验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:*' );

数据.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
x9ybnkn6

x9ybnkn62#

这是处理多结构模式时的常见问题。如果你真的想尝试这种Map类型,那么这是一个坏主意。
你可以用mapreduce试试这个。mapreduce是最好的解决方案。

相关问题