Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop Spark Streaming-HBase批量加载_Hadoop_Hbase_Pyspark - Fatal编程技术网

Hadoop Spark Streaming-HBase批量加载

Hadoop Spark Streaming-HBase批量加载,hadoop,hbase,pyspark,Hadoop,Hbase,Pyspark,我目前正在使用Python将CSV数据批量加载到HBase表中,并且我目前在使用saveAsNewAPIHadoopFile 我的代码目前如下所示: def csv_to_key_value(row): cols = row.split(",") result = ((cols[0], [cols[0], "f1", "c1", cols[1]]), (cols[0], [cols[0], "f2", "c2", cols[2]]),

我目前正在使用Python将CSV数据批量加载到HBase表中,并且我目前在使用
saveAsNewAPIHadoopFile

我的代码目前如下所示:

def csv_to_key_value(row):
    cols = row.split(",")
    result = ((cols[0], [cols[0], "f1", "c1", cols[1]]),
              (cols[0], [cols[0], "f2", "c2", cols[2]]),
              (cols[0], [cols[0], "f3", "c3", cols[3]]))
    return result

def bulk_load(rdd):
    conf = {#Ommitted to simplify}

    keyConv = "org.apache.spark.examples.pythonconverters.StringToImmutableBytesWritableConverter"
    valueConv = "org.apache.spark.examples.pythonconverters.StringListToPutConverter"

    load_rdd = rdd.flatMap(lambda line: line.split("\n"))\
                  .flatMap(csv_to_key_value)
    if not load_rdd.isEmpty():
        load_rdd.saveAsNewAPIHadoopFile("file:///tmp/hfiles" + startTime,
                                        "org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2",
                                        conf=conf,
                                        keyConverter=keyConv,
                                        valueConverter=valueConv)
    else:
        print("Nothing to process")
运行此代码时,出现以下错误:

java.io.IOException:添加了一个在词汇上不大于上一个的键。当前单元格=10/f1:c1/1453891407213/Minimum/vlen=1/seqid=0,lastCell=/f1:c1/1453891407212/Minimum/vlen=1/seqid=0位于org.apache.hadoop.hbase.io.hfile.AbstractHFileWriter.checkKey(AbstractHFileWriter.java:204)

由于错误表明键是问题所在,我从RDD中获取了元素,它们如下所示(为可读性而格式化)

这与我的CSV非常匹配,顺序正确。据我所知,在HBase中,键由{row,family,timestamp}定义。行和族的组合是唯一的,对于我的数据中的所有条目都是单调递增的,我无法控制时间戳(这是我能想象到的唯一问题)


有谁能建议我如何避免/防止这些问题吗?

这只是我的一个愚蠢的错误,我觉得有点愚蠢。按字典顺序,顺序应该是1,10,2,3。。。8, 9. 确保装载前正确订购的最简单方法是:

rdd.sortByKey(true);
我希望我至少能挽救一个人的头痛

 (u'9', [u'9', 'f1', 'c1', u'I']),
 (u'9', [u'9', 'f2', 'c2', u'3C']),
 (u'9', [u'9', 'f3', 'c3', u'2']),
 (u'10', [u'10', 'f1', 'c1', u'J']),
 (u'10', [u'10', 'f2', 'c2', u'1A']),
 (u'10', [u'10', 'f3', 'c3', u'1'])]
rdd.sortByKey(true);