2012-10-31 42 views
12

Trông giống như một vấn đề ngớ ngẩn, nhưng tôi không thể tìm cách lọc các giá trị null từ các hàng của tôi. Đây là kết quả khi tôi đổ đối tượng GeoInfo:Lọc các giá trị null bằng pig

DUMP geoinfo;
([longitude#70.95853,latitude#30.9773])
([longitude#-9.37944507,latitude#38.91780853])
(null)
(null)
(null)
([longitude#-92.64416,latitude#16.73326])
(null)
(null)
([longitude#-9.15199849,latitude#38.71179122])
([longitude#-9.15210796,latitude#38.71195131])

đây là mô tả

DESCRIBE geoinfo;
geoinfo: {geoLocation: bytearray}

Những gì tôi đang cố gắng làm là để lọc các giá trị null như thế này:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation is not null;

nhưng kết quả vẫn giữ nguyên. không có gì được lọc.

Tôi cũng đã cố gắng một cái gì đó như thế này

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != 'null';

và tôi đã nhận ra lỗi

org.apache.pig.backend.executionengine.ExecException: ERROR 1071: Cannot convert a map to a String

Tôi đang làm gì sai?

chi tiết, chạy trên ubuntu, hadoop-1.0.3 với lợn 0.9.3

lợn -version Apache Pig phiên bản 0.9.3-SNAPSHOT (rexported) biên soạn 24 tháng 10 năm 2012, 19:04:03

java phiên bản "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64-Bit server VM (xây dựng 20,0-b12, chế độ hỗn hợp)

+0

Hãy gửi kịch bản hoàn chỉnh của bạn. –

Trả lời

3

Tôi gặp sự cố tương tự và một cái gì đó như thế này đã hoạt động đối với tôi:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != ''; 
+0

Tôi gặp lỗi > ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Không thể tạo lại ngoại lệ từ lỗi được sao lưu: org.apache.pig.backend.executionengine.ExecException: ERROR 1071: Không thể chuyển đổi bản đồ đến một chuỗi –

+0

Khá nhiều Kishan tương tự. Không biết làm thế nào để giải quyết điều này. –

+0

Hãy thử cung cấp cho nó như là địa chỉ. $ 0! = '' Hoặc geo.geoLocation! = ''. Hoặc là một trong số chúng sẽ hoạt động – emkay

0

Giả sử bạn muốn định vị của bạn để có một bản đồ với kinh độ và vĩ độ như phím, bạn có thể tải dữ liệu của bạn dưới dạng bản đồ và kiểm tra null như sau:

A = LOAD 'data' AS (f1:map[]); 
B = FILTER A BY f1#longitude is not null and f1#latitude is not null; 

Đó là loại một cách giải quyết duy nhất , Tuy nhiên.

0

Hãy thử điều này:

geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);

Như tôi đã có thể nhìn thấy từ lỗi nó được công nhận kiểu như một bản đồ. Bạn cần chỉ định khóa cụ thể của bản đồ. Nếu điều đó không hiệu quả, bạn thường không nhận được dữ liệu đó đúng như bản đồ. Hãy thử như Fred cho biết.

3

Cảm ơn bạn đã trả lời cho các bạn. Nó giúp tôi tìm đường đi.

Cuối cùng, các đường nối vấn đề sẽ xảy ra với JsonLoader tôi đang sử dụng. Tôi không biết tại sao chính xác, nhưng nó seams để có một lỗi với chuỗi null.

Cuối cùng tôi đã thay đổi mã của mình để sử dụng https://github.com/kevinweil/elephant-bird.

mã ngay bây giờ trông như thế này:

register 'elephant-bird-core-3.0.0.jar' 
    register 'elephant-bird-pig-3.0.0.jar' 
    register 'google-collections-1.0.jar' 
    register 'json-simple-1.1.jar' 

    json_lines = LOAD '/twitterecho/tweets/stream/v1/json/2012_10_10/08' USING com.twitter.elephantbird.pig.load.JsonLoader(); 

    geo_tweets = FOREACH json_lines GENERATE (CHARARRAY) $0#'id' AS id, (CHARARRAY) $0#'geoLocation' AS geoLocation; 

    tweets_grp = GROUP geo_tweets BY id; 
    unique_tweets = FOREACH tweets_grp { 
      first_tweet = LIMIT inpt 1; 
      GENERATE FLATTEN(first_tweet); 
    }; 

    only_not_nulls = FILTER geo_tweets BY geoLocation is not null; 
    store only_not_nulls into '/twitter_data/results/geo_tweets'; 

cổ vũ

Các vấn đề liên quan