我正在使用EMR来分析web nginx日志.但我需要处理日志,以便它可以分为行和列,以便于查询.因此,我按以下方式制作了两个表 - rawlog,processedlog:
create table rawlog(line string)
row format delimited fields terminated by '\t' lines terminated by '\n'
LOCATION 's3://istreamanalytics/logs/';
CREATE EXTERNAL TABLE processedlog (
day string,
hour int,
playSessionId string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
Run Code Online (Sandbox Code Playgroud)
并为可以进行转换的hive添加了一个ruby脚本,脚本如下:
#!/usr/bin/env ruby
mon={"Jan" => '01',"Feb" => '02',"Mar" => '03',"Apr" => '04',"May" => '05',"Jun" => '06',"Jul" => '07',"Aug" => '08',"Sep" => '09',"Oct" => '10',"Nov" => '11',"Dec" => '12'}
STDIN.each_line do |line|
if line =~ /(\d+)\/(\w+)\/(\d+):(\d+):\d+:\d+ \+\d+] …
Run Code Online (Sandbox Code Playgroud) hive transform amazon-s3 amazon-web-services elastic-map-reduce
我已经看到某处而不是在perl中使用chomp我们可以使用一些正则表达式来实现相同的任务.任何人都可以告诉正则表达式将在perl中遇到chomp
提前致谢
我花了太长时间才使用警告; 严格 在Perl,但现在我做了,我看到了优点.
我还不确定的一件事是何时定义一个临时变量.这似乎是一件微不足道的事情,但我运行了很多蒙特卡罗模拟,其中失去一点时间加起来超过10000次迭代.我一直懒得在更快的模拟上使用严格/警告,但它们变得更加复杂,所以我真的需要.
所以(切掉代码来计算东西)我想知道是否
sub doStuff
{
my $temp;
for my $x (1..50)
{
$temp = $x**2;
}
for my $x (1..50)
{
$temp = $x**3;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
sub doStuff
{
for my $x (1..50)
{
my $temp = $x**2;
}
for my $x (1..50)
{
my $temp = $x**3;
}
}
Run Code Online (Sandbox Code Playgroud)
效率更低/更高,或者如果违反了一些我还不知道的Perl编码.