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的转化,的更多相关文章

  1. TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...

  2. C++中类型强制转换

    C++中强制类型转换有四种: 1.static_cast 格式:static_cast<Type>(Value); --用于基本类型间的转换,但不能用于基本类型指针间的转换: int i ...

  3. java代码---数据类型的强制转换----不懂啊

    总结:看写的测试代码 字符到整型必须进行强制转换 package com.a.b; //byte→int 可以 int范围大,不必转换 B.short→long //C.float→double 这个 ...

  4. C语言中的字符和整数之间的转换

    首先对照ascal表,查找字符和整数之间的规律: ascall 控制字符  48  0  49  1  50  2  51  3  52  4  53  5  54  6  55  7  56  8 ...

  5. JavaScript学习笔记——数据类型强制转换和隐式转换

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  6. 简述Java变量和强制转换类型

    简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...

  7. Java数据类型的转换:隐式(自动)转换与强制转换

    原文链接:http://java.chinaitlab.com/base/725590.html 一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double ...

  8. python 查看帮助和变量的强制转换

    查看帮助 dir() 函数 查看对象都有哪些属性和方法 用法:把要查询的对象写入()括号中即可 print(dir([])) (查看列表的方法) 执行: C:\Python27\python.exe ...

  9. PHP强制转换类型

    PHP强制转换类型   获取数据类型 : 1.如果想查看某个表达式的值和类型,用var_dump(). 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype().3.要查看某个类型 ...

随机推荐

  1. eclipse的maven操作无反应

    第一 查eclipse能不能正常用 hi world.java 第二 查maven能不能正常用 cmd: mvn -v 第三 看看maven和eclipse是不是64位之类的 第四 maven和ecl ...

  2. Springboot项目maven多模块拆分

    多模块拆分的必要性 使用Java技术开发的工程项目,无论是数据处理系统还是Web网站,随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂这时候工程的进展就会遇到各种 ...

  3. CODEVS3269混合背包+二进制优化

    codevs 3296 http://codevs.cn/problem/3269/ 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至 ...

  4. 智能指针之 unique_ptr

    对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存, 我们需要时刻记得释放,且不能重复释放,释放后不能再去 ...

  5. Go 语言类型转换

    类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expression 为表达式. 实 ...

  6. MongoDB $type条件操作符

    描述 在本章节中,我们将继续讨论MongoDB中条件操作符 $type. $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 ...

  7. Dynamics CRM 部署NLB后使用群集名称访问弹验证框验证不过的解决方法

    自上次部署NLB到现在已有段时间了,今天部署完后遇到了个问题,上次也遇到过但忘记了,本篇作为对该问题的一个记录,部署文档:https://blogs.msdn.microsoft.com/niran_ ...

  8. 【伯乐在线】HashMap的工作原理

    本文由 ImportNew - 唐小娟 翻译自 Javarevisited.欢迎加入翻译小组.转载请见文末要求. HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道Ha ...

  9. Activity平移动画

    Activity平移动画 效果图 添加动画文件 在res下添加anim文件夹,在anim下添加几个动画文件,分别是进入和退出的动画时间和移动距离,属性很简单,一看就懂,不磨叽了. tran_next_ ...

  10. Java使用agent实现main方法之前

    创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { public static void premain ...