pig强制转换(字符到整数):首位0怎么处理,‘01’到1的转化,
pig支持的类型转换(cast)
Pig Latin supports casts as shown in this table.
|
from / to |
bag |
tuple |
map |
int |
long |
float |
double |
chararray |
bytearray |
boolean |
|
|
bag |
error |
error |
error |
error |
error |
error |
error |
error |
error |
||
|
tuple |
error |
error |
error |
error |
error |
error |
error |
error |
error |
||
|
map |
error |
error |
error |
error |
error |
error |
error |
error |
error |
||
|
int |
error |
error |
error |
yes |
yes |
yes |
yes |
error |
error |
||
|
long |
error |
error |
error |
yes |
yes |
yes |
yes |
error |
error |
||
|
float |
error |
error |
error |
yes |
yes |
yes |
yes |
error |
error |
||
|
double |
error |
error |
error |
yes |
yes |
yes |
yes |
error |
error |
||
|
chararray |
error |
error |
error |
yes |
yes |
yes |
yes |
error |
yes |
||
|
bytearray |
yes |
yes |
yes |
yes |
yes |
yes |
yes |
yes |
yes |
||
|
boolean |
error |
error |
error |
error |
error |
error |
error |
yes |
error |
表中,将字符类型转化做int是可以的。
那么001 转化为int型后是1么?
测试如下
数据文件test_file.txt内容为:
1011,012
0111,100
0011,010
0001,010
1010,001
读入test_file.txt,将第一列的chararray类型数据,提取前三个字段,强制转换为int类型。
而第二列直接按int类型读入,看看首位0怎么处理
pig 代码:
%default testFile /user/wizad/test/lmj/test_file.txt
test_data = LOAD '$testFile' USING PigStorage(',')
AS
(str1:chararray,
number:int
);
dump test_data;
my_result = foreach test_data generate (int)SUBSTRING(str1,0,3);
dump my_result;
describe my_result;
--myts = sample g_log 0.0001;
--myts = limit g_log 10;
--dump myts;
--STORE myts INTO '/user/wizad/tmp/my' USING PigStorage(',');
运行结果
dump test_data:
(1011,12)
(0111,100)
(0011,10)
(0001,10)
(1010,1)
dump my_result:
(101)
(11)
(1)
(0)
(101)
可以看出首位0处理没有任何问题。
顺便一提:
debug或检查数据时,能用store,不用dump。要用dump就只用dump。我dump前,都先limit 10,只dump 10条数据
因为,dump会让某些multi-query execution失效。看起来像降低运行数据。
举例子:
两个脚本一个执行 A > B >DUMP
而另一个执行A > B > C > STORE
第一个脚本:
A = LOAD 'input'AS (x, y, z);
B = FILTER A BY x> 5;
DUMP B;
C = FOREACH BGENERATE y, z;
STORE C INTO'output';
store脚本:生成output1和output2两个文件,执行A > B > C > STORE
A = LOAD 'input'AS (x, y, z);
B = FILTER A BY x> 5;
STORE B INTO'output1';
C = FOREACH BGENERATE y, z;
STORE C INTO'output2';
我工作中,需要比较两个日志的ip,time,os,来识别是否是相同用户。而time需要判定5分钟内相同用户。所以我做了一个小处理,
将是时间从分钟切分:
time_extract = foreach cookie_data generate cookie_id,ip,SUBSTRING(time,0,13) as time,SUBSTRING(time,14,16) as minute1,os_id,os_version;
log_data = foreach click_log generate log_type,guid,ip,SUBSTRING(create_time,0,13) as time,SUBSTRING(create_time,14,16) as minute2,os_id,os_version;
然后,将两个relation按 time进行join,就是比较到小时的:
join_data = join time_extract by (ip,time,os_id), log_data by (ip,time,os_id);
在相同小时的记录中,找5分钟内的:
minute_compare = foreach join_data generate log_type,cookie_id,guid,(int)minute1,(int)minute2,time_extract::os_version,log_data::os_version;
same_users = filter minute_compare by (ABS(minute1-minute2) <= 5);
绝对值小于5的。
完成代码如下:
SET job.name 'mapping_from_mobile_to_pc';
SET job.priority HIGH;
REGISTER piggybank.jar;
DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader();
%default cleanedLog /user/wizad/data/wizad/cleaned/2014-11-{0[3-9],1[0-8]}/*/part*
%default cookieLog /user/wizad/tmp/ip_cookie.txt
%default output_path1 /user/wizad/tmp/mapping_cookie
%default output_path2 /user/wizad/tmp/edition_compare
cookie_data = LOAD '$cookieLog' USING PigStorage(',')
AS(cookie_id:chararray,
ip:chararray,
time:chararray,
os_id:chararray,
os_version:chararray
);
--test = limit cookie_data 100;
--dump test;
time_extract = foreach cookie_data generate cookie_id,ip,SUBSTRING(time,0,13) as time,SUBSTRING(time,14,16) as minute1,os_id,os_version;
describe time_extract;
origin_cleaned_data = LOAD '$cleanedLog' USING SequenceFileLoader
AS (ad_network_id:chararray,
wizad_ad_id:chararray,
guid:chararray,
id:chararray,
create_time:chararray,
action_time:chararray,
log_type:chararray,
ad_id:chararray,
positioning_method:chararray,
location_accuracy:chararray,
lat:chararray,
lon:chararray,
cell_id:chararray,
lac:chararray,
mcc:chararray,
mnc:chararray,
ip:chararray,
connection_type:chararray,
imei:chararray,
android_id:chararray,
android_advertising_id:chararray,
udid:chararray,
openudid:chararray,
idfa:chararray,
mac_address:chararray,
uid:chararray,
density:chararray,
screen_height:chararray,
screen_width:chararray,
user_agent:chararray,
app_id:chararray,
app_category_id:chararray,
device_model_id:chararray,
carrier_id:chararray,
os_id:chararray,
device_type:chararray,
os_version:chararray,
country_region_id:chararray,
province_region_id:chararray,
city_region_id:chararray,
ip_lat:chararray,
ip_lon:chararray,
quadkey:chararray);
click_log = filter origin_cleaned_data by log_type=='2';
log_data = foreach click_log generate log_type,guid,ip,SUBSTRING(create_time,0,13) as time,SUBSTRING(create_time,14,16) as minute2,os_id,os_version,device_type;
--join_data = join time_extract by ip, log_data by ip;
--join_data = join time_extract by (ip,time), log_data by (ip,time);
join_data = join time_extract by (ip,time,os_id), log_data by (ip,time,os_id);
minute_compare = foreach join_data generate log_type,cookie_id,guid,(int)minute1,(int)minute2,time_extract::os_version,log_data::os_version;
same_users = filter minute_compare by (ABS(minute1-minute2) <= 5);
--dump same_users;
describe same_users;
mapping_cookie_id = foreach same_users generate cookie_id,guid;
uniq_cookie_guid = distinct mapping_cookie_id;
store uniq_cookie_guid INTO '$output_path1' USING PigStorage(',');
os_edition = foreach same_users generate cookie_id,guid,SUBSTRING(time_extract::os_version,0,2) as os_ut,SUBSTRING(log_data::os_version,0,2) as os_mdm;
same_os_edition = filter os_edition by (os_ut == os_mdm) or (os_ut == 'x')or (os_mdm == 'x');
dump same_os_edition;
cookie_guid_with_edition = foreach same_os_edition generate cookie_id,guid;
uniq_c_g_editions = distinct cookie_guid_with_edition;
store uniq_c_g_editions INTO '$output_path2' USING PigStorage(',');
pig强制转换(字符到整数):首位0怎么处理,‘01’到1的转化,的更多相关文章
- TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。
1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...
- C++中类型强制转换
C++中强制类型转换有四种: 1.static_cast 格式:static_cast<Type>(Value); --用于基本类型间的转换,但不能用于基本类型指针间的转换: int i ...
- java代码---数据类型的强制转换----不懂啊
总结:看写的测试代码 字符到整型必须进行强制转换 package com.a.b; //byte→int 可以 int范围大,不必转换 B.short→long //C.float→double 这个 ...
- C语言中的字符和整数之间的转换
首先对照ascal表,查找字符和整数之间的规律: ascall 控制字符 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 ...
- JavaScript学习笔记——数据类型强制转换和隐式转换
javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...
- 简述Java变量和强制转换类型
简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...
- Java数据类型的转换:隐式(自动)转换与强制转换
原文链接:http://java.chinaitlab.com/base/725590.html 一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double ...
- python 查看帮助和变量的强制转换
查看帮助 dir() 函数 查看对象都有哪些属性和方法 用法:把要查询的对象写入()括号中即可 print(dir([])) (查看列表的方法) 执行: C:\Python27\python.exe ...
- PHP强制转换类型
PHP强制转换类型 获取数据类型 : 1.如果想查看某个表达式的值和类型,用var_dump(). 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype().3.要查看某个类型 ...
随机推荐
- eclipse的maven操作无反应
第一 查eclipse能不能正常用 hi world.java 第二 查maven能不能正常用 cmd: mvn -v 第三 看看maven和eclipse是不是64位之类的 第四 maven和ecl ...
- Springboot项目maven多模块拆分
多模块拆分的必要性 使用Java技术开发的工程项目,无论是数据处理系统还是Web网站,随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂这时候工程的进展就会遇到各种 ...
- CODEVS3269混合背包+二进制优化
codevs 3296 http://codevs.cn/problem/3269/ 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至 ...
- 智能指针之 unique_ptr
对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存, 我们需要时刻记得释放,且不能重复释放,释放后不能再去 ...
- Go 语言类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expression 为表达式. 实 ...
- MongoDB $type条件操作符
描述 在本章节中,我们将继续讨论MongoDB中条件操作符 $type. $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 ...
- Dynamics CRM 部署NLB后使用群集名称访问弹验证框验证不过的解决方法
自上次部署NLB到现在已有段时间了,今天部署完后遇到了个问题,上次也遇到过但忘记了,本篇作为对该问题的一个记录,部署文档:https://blogs.msdn.microsoft.com/niran_ ...
- 【伯乐在线】HashMap的工作原理
本文由 ImportNew - 唐小娟 翻译自 Javarevisited.欢迎加入翻译小组.转载请见文末要求. HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道Ha ...
- Activity平移动画
Activity平移动画 效果图 添加动画文件 在res下添加anim文件夹,在anim下添加几个动画文件,分别是进入和退出的动画时间和移动距离,属性很简单,一看就懂,不磨叽了. tran_next_ ...
- Java使用agent实现main方法之前
创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { public static void premain ...