在HDFS中查询列的行值

时间:2015-09-16 18:04:31

标签: python hadoop

我在hdfs中有一个制表符分隔的文本文件,该文件是从其他人构建的文本分析中输出的,看起来像这样。真正的文件是18k列宽,当每月刷新时,列数不是静态的,列名也不是。

Product ID    [I love peanuts]    [Your mom is silly]   [Let's eat pizza]
P-ABCD               0                     0                     1
P-1234               1                     1                     0

我需要编写一个程序来搜索或查询"让我们吃披萨"并返回P-ABCD。

我目前正在使用Python,但我对python和map reduce都不熟悉,所以我无法解决如何解决这个问题。情况很奇怪,我还没有找到解决方案。

我在想是否可以转动"表",以便它看起来像这样:

ProductID  Phrase 
P-ABCD     [Let's eat pizza]

这会更容易使用,但我不确定哪种语言或技术最好。关于你如何解决它的任何想法?

2 个答案:

答案 0 :(得分:1)

file.txt的

Product ID  I love peanuts  Your mom is silly   Let's eat pizza
P-ABCD  0   0   1
P-1234  1   1   0

import csv

def search(search_column, search_value):

    with open('file.txt', 'rb') as f:
        header = []
        reader = csv.reader(f, delimiter='\t', quotechar='"')
        for row in reader:
            if not row:
                continue
            if not header:
                header = row
                continue
            row = dict(zip(header, row))
            if row.get(search_column) == search_value:
                return row.get('Product ID')
        return None

print search('Let\'s eat pizza', '1')

答案 1 :(得分:0)

def searchTable(look_for):

    import shlex
    import re

    l_rows = []

    with open("1_table_data") as f:

        for line in f:
            line = line.replace("Product ID", "Product_ID")
            line = shlex.split(re.sub('[\[\]]','\"', line))
            l_rows.append(line)


    index_of_look_for = l_rows[0].index(look_for)

    for i in range(1, len(l_rows)):
        if int(l_rows[i][index_of_look_for]) == 1:
            print(l_rows[i][0])

searchTable(“让我们吃披萨”)

P-ABCD

searchTable(“我喜欢花生”)

P-1234

searchTable(“你的妈妈很傻”)

P-1234