Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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
Python 基于感兴趣的日期范围作为参数输入,限制以Pig拉丁语加载日志文件_Python_Hadoop_Apache Pig - Fatal编程技术网

Python 基于感兴趣的日期范围作为参数输入,限制以Pig拉丁语加载日志文件

Python 基于感兴趣的日期范围作为参数输入,限制以Pig拉丁语加载日志文件,python,hadoop,apache-pig,Python,Hadoop,Apache Pig,我在加载基于参数输入的日志文件时遇到问题,我想知道是否有人能够提供一些指导。所讨论的日志是Omniture日志,存储在基于年、月和日(例如/year=2013/month=02/day=14)的子目录中,文件名中带有日期戳。对于任何一天,都可能存在多个日志,每个日志都有数百MB 我有一个Pig脚本,它当前处理整个月份的日志,并将月份和年份指定为脚本参数(例如/year=$year/month=$month/day=*)。它工作得很好,我们对此很满意。这就是说,我们希望切换到每周处理日志,这意味着

我在加载基于参数输入的日志文件时遇到问题,我想知道是否有人能够提供一些指导。所讨论的日志是Omniture日志,存储在基于年、月和日(例如/year=2013/month=02/day=14)的子目录中,文件名中带有日期戳。对于任何一天,都可能存在多个日志,每个日志都有数百MB

我有一个Pig脚本,它当前处理整个月份的日志,并将月份和年份指定为脚本参数(例如/year=$year/month=$month/day=*)。它工作得很好,我们对此很满意。这就是说,我们希望切换到每周处理日志,这意味着以前的加载路径glob将不起作用(周可以包含月,也可以包含年)。为了解决这个问题,我有一个Python UDF,它有一个开始日期,并为一周的日志提供必要的glob,例如:

>>> log_path_regex(2013, 1, 28)
'{year=2013/month=01/day=28,year=2013/month=01/day=29,year=2013/month=01/day=30,year=2013/month=01/day=31,year=2013/month=02/day=01,year=2013/month=02/day=02,year=2013/month=02/day=03}'
然后将此glob插入到适当的路径中:

> %declare omniture_log_path 's3://foo/bar/$week_path/*.tsv.gz';
> data = LOAD '$omniture_log_path' USING OmnitureTextLoader(); // See http://github.com/msukmanowsky/OmnitureTextLoader
不幸的是,我一辈子都不知道如何基于$year、$month和$day脚本参数填充$week_路径。我尝试使用%declare,但grunt抱怨,说它的日志记录,但从来没有:

> %declare week_path util.log_path_regex(year, month, day);
2013-02-14 16:54:02,648 [main] INFO  org.apache.pig.Main - Apache Pig version 0.10.1 (r1426677) compiled Dec 28 2012, 16:46:13
2013-02-1416:54:02,648 [main] INFO  org.apache.pig.Main - Logging error messages to: /tmp/pig_1360878842643.log % ls  /tmp/pig_1360878842643.log
ls: cannot access /tmp/pig_1360878842643.log: No such file or directory
如果在参数前面加上美元符号或在参数前面加引号,则会出现相同的错误

如果我尝试使用define(我认为它只适用于静态Java函数),我会得到以下结果:

> define week_path util.log_path_regex(year, month, day);
2013-02-14 17:00:42,392 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <file script.pig, line 11, column 37>  mismatched input 'year' expecting RIGHT_PAREN
>定义周路径util.log路径regex(年、月、日);
2013-02-14 17:00:42392[main]错误org.apache.pig.tools.grunt.grunt-错误1200:输入“年”不匹配,预期正确
与%declare一样,如果在参数前面加上美元符号或在参数前面加引号,则会出现相同的错误

我到处找了找,还没有找到解决办法。我可能找错东西了。调用shell命令可能会起作用,但会很困难,因为它会使脚本部署复杂化,并且可能不可行,因为我们正在从S3而不是装载的目录检索日志。类似地,将生成的glob作为单个参数传递可能会使实例化MapReduce集群上的自动化作业复杂化

除了使用globs外,还有一种很好的猪友好方式来限制负载。也就是说,我仍然必须使用我的UDF,这似乎是问题的根源

这实际上归结为我想在LOAD语句中包含一个构建在Pig内部的动态路径glob。猪似乎没那么容易

我是否需要将UDF转换为静态Java方法?还是我会遇到同样的问题?(我不太愿意这样做,因为它可能会起作用。它是一个8行Python函数,易于部署,比同等的Java代码更易于维护。)

答案是自定义LoadFunc吗?有了它,我大概必须指定/year=/month=/day=*并强制Pig测试每个文件名是否有一个介于两个日期之间的日期戳。这似乎是一个巨大的黑客和资源浪费

有什么想法吗?

I。我的理解是,Pig将首先预处理其脚本,以在构建DAG之前替换参数、导入和宏。这使得在现有变量的基础上构建新变量变得有些不可能,并解释了我未能构建UDF来构建路径全局

如果您是Pig开发人员,需要基于现有参数构建新变量,则可以使用另一个脚本来构建这些变量并将它们作为参数传递给Pig脚本,也可以探索需要在何处使用这些新变量,并根据需要在单独的构造中构建它们

在我的情况下,我不情愿地选择创建。此
LoadFunc
在其构造函数中接受报告期间开始的日期、月份和年份,并构建
pathGlob
属性以匹配该期间的路径。然后将该
pathGlob
插入到
setLocation()
中的一个位置。例如

/**
 * Limit data to a week starting at given day. If day is 0, month is assumed.
 */
public WeeklyOrMonthlyTextLoader(String year, String month, String day) {
    super();
    pathGlob = getPathGlob(
        Integer.parseInt(year),
        Integer.parseInt(month),
        Integer.parseInt(day)
    );
}

/**
 * Replace DATE_PATH in location with glob required for reading in this
 * month or week of data. This assumes the following directory structure:
 *
 * <code>/year=&gt;year&lt;/month=&gt;month&lt;/day=&gt;day&lt;/*</code>
 */
@Override
public void setLocation(String location, Job job) throws IOException {
    location = location.replace(GLOB_PLACEHOLDER, pathGlob);
    super.setLocation(location, job);
}
然后,可以从如下所示的Pig脚本中调用:

DEFINE TextLoader com.foo.WeeklyOrMonthlyTextLoader('$year', '$month', '$day');
请注意,构造函数接受的是
String
,而不是
int
。这是因为Pig中的参数是字符串,不能在Pig脚本中强制转换或转换为其他类型(在MR任务中使用时除外)

虽然与包装器脚本相比,创建自定义的
LoadFunc
似乎有些过分,但我希望解决方案是纯Pig的,以避免强制分析师在使用脚本之前执行设置任务。在为计划作业创建AmazonMapReduce集群时,我还希望在不同的时间段使用StockPig脚本