【问题标题】:Filtering null values with pig用 pig 过滤空值
【发布时间】:2012-10-21 08:20:27
【问题描述】:

这看起来像一个愚蠢的问题,但我找不到从我的行中过滤空值的方法。 这是我转储对象地理信息时的结果:

转储地理信息;
([经度#70.95853,纬度#30.9773])
([经度#-9.37944507,纬度#38.91780853])
(空)
(空)
(空)
([经度#-92.64416,纬度#16.73326])
(空)
(空)
([经度#-9.15199849,纬度#38.71179122])
([经度#-9.15210796,纬度#38.71195131])

这里是描述

描述地理信息;
geoinfo: {geoLocation: bytearray}

我想要做的是像这样过滤空值:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation 不为空;

但结果保持不变。没有任何内容被过滤。

我也尝试过类似的方法

geoinfo_no_nulls = 按地理位置过滤地理信息!= 'null';

我遇到了一个错误

org.apache.pig.backend.executionengine.ExecException:错误 1071:无法将映射转换为字符串

我做错了什么?

详情,在 ubuntu 上运行,hadoop-1.0.3 和 pig 0.9.3

猪版 Apache Pig 版本 0.9.3-SNAPSHOT(重新导出) 2012年10月24日19:04:03编译

java 版本“1.6.0_24” OpenJDK 运行时环境 (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64 位服务器虚拟机(build 20.0-b12,混合模式)

【问题讨论】:

  • 请发布您的完整脚本。

标签: hadoop apache-pig


【解决方案1】:

我遇到了类似的问题,这样的事情对我有用:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';

【讨论】:

  • 我收到错误 >ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Unable to recreate exception from backend error: org.apache.pig.backend.executionengine.ExecException: ERROR 1071: 无法将地图转换为字符串
  • 尝试将其作为 geoinfo.$0!='' 或 geoinfo.geoLocation!=''。他们中的任何一个都应该工作
【解决方案2】:

假设您希望您的地理位置是以经度和纬度为键的地图,您可以将数据加载为地图并检查空值,如下所示:

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

不过,这只是一种解决方法。

【讨论】:

    【解决方案3】:

    试试这个:

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

    正如我从错误中看到的,它将类型识别为地图。您需要指定地图的特定键。 如果这不起作用,您通常无法正确获取该数据作为地图。 请按照 Fred 的指示尝试。

    【讨论】:

      【解决方案4】:

      谢谢你们的回答。 它帮助我找到路径。

      最后,我使用的 JsonLoader 出现了问题。 我不知道究竟是为什么,但它似乎有一个带有空字符串的错误。

      我终于把代码改成了https://github.com/kevinweil/elephant-bird

      现在的代码如下所示:

          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';
      

      干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        相关资源
        最近更新 更多