我的数据集(CSV)有三个值列(v1,2和3),带有值。该值的描述将以逗号分隔的字符串形式存储在“'键”中。
| v1 | v2 | v3 | keys |
| A | C | E | X,Y,Z |
使用Pig我想在HBase表中加载此信息,其中Column Family为C且列限定符为键。
| C:X | C:Y | C:Z |
| A | C | E |
之前是否有人这样做过并希望分享这些知识?
另一种选择是将地图(键#值)存储在HBase列中。但我不确定这对于查询数据是否灵活?
答案 0 :(得分:0)
这是处理多结构架构时的常见问题。如果你真的想尝试使用MAP类型,那么这是一个坏主意。
您可以使用MapReduce尝试此操作。 MapReduce是最佳解决方案。
答案 1 :(得分:0)
找到我的问题的解决方案
<强> 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