如何在从Hive读取的RDD格式数据中创建虚拟变量

时间:2017-12-01 13:40:30

标签: python pyspark rdd

我正在考虑在Pyspark中创建一个虚拟变量数据集,并从hive表中加载数据并以RDD格式存储数据。

数据大小为20000000 * 11(行*列)

(在集群上)RDD将hive表转换为嵌套列表,我对处理它的方式感到困惑(与python不同)。

问题:有没有办法维护前两个变量( id lable )并将新变量插入到identiy 标签(作为名义可变,例如group_1,group_2,基于条件分配)之前 获得虚拟变量编码(基于其余变量)

我曾尝试使用键值方法,但它无效。任何想法都将不胜感激。

期望的结果(dummuy编码) 伪编码(0,1)的长度由跨行的所有变量的唯一元素确定。

[u'007896797eed11ba73dd', u'18-24', 0, 0, 0,0,0,0,0,1,1,1,1]

例如,上述用户未安装 ins_com.meitu.meipaimv ,因此它将为0,如果 ins_com.meitu.xxxx 安装然后它是1

示例数据

[[u'007896797eed11ba73dd', u'18-24', u'ins_com.meitu.meipaimv,ins_com.babytree.apps.pregnancy,ins_com.sankuai.meituan,ins_cn.damai,ins_com.google.android.gms,ins_com.taobao.taobao,ins_com.sina.weibo,ins_com.google.android.syncadapters.calendar,ins_com.tencent.qqmusic,ins_com.tencent.mm,ins_com.lemon.faceu,ins_com.zhihu.android,ins_com.Qunar,ins_com.eg.android.AlipayGphone,ins_com.airbnb.android,ins_com.lingan.seeyou,ins_com.qicai.translate,ins_com.mt.mtxx.mtxx,ins_vz.com,ins_com.ganji.android,ins_com.google.android.gsf,ins_com.taobao.trip,ins_com.mfw.roadbook,ins_com.tencent.mobileqq', u'act_cn.damai,act_com.taobao.trip,act_com.sankuai.meituan,act_com.google.android.gms,act_com.eg.android.AlipayGphone,act_com.tencent.mm,act_com.sina.weibo,act_com.babytree.apps.pregnancy,act_com.taobao.taobao,act_com.meitu.meipaimv,act_com.mfw.roadbook,act_com.zhihu.android,act_com.mt.mtxx.mtxx', u'inst_ct_21_40', u'installed1', u'inst_cate_ct_13_16', u'active_ct_10_20', u'activ_1', u'phone_price_2500_3500', u''], [u'4ac74594b0fe17b532e7f278', u'25-34', u'ins_com.easysay.japanese,ins_com.tencent.mobileqq,ins_com.eg.android.AlipayGphone,ins_com.google.android.syncadapters.calendar,ins_com.zhaopin.social,ins_com.taobao.taobao,ins_com.kugou.android,ins_com.sina.weibo,ins_com.tencent.qqlive,ins_cmb.pb,ins_com.android.browser,ins_com.baidu.searchbox,ins_com.sohu.inputmethod.sogou,ins_cn.wps.moffice_eng,ins_com.qiyi.video,ins_com.tencent.mm,ins_com.autonavi.minimap,ins_com.luojilab.player,ins_com.liulishuo.engzo', u'act_com.zhaopin.social,act_com.tencent.mm,act_com.sina.weibo', u'inst_ct_0_20', u'installed12,installed9', u'inst_cate_ct_9_12', u'active_ct_4_5', u'activ_12', u'phone_price_801_1500', u'']]

1 个答案:

答案 0 :(得分:0)

首先找到完整的元素并修复订单。

然后将数据maping到此集。

data_rdd = sc.parallelize([[u'007896797eed11ba73dd', u'18-24', u'ins_com.meitu.meipaimv,ins_com.babytree.apps.pregnancy,ins_com.sankuai.meituan,ins_cn.damai,ins_com.google.android.gms,ins_com.taobao.taobao,ins_com.sina.weibo,ins_com.google.android.syncadapters.calendar,ins_com.tencent.qqmusic,ins_com.tencent.mm,ins_com.lemon.faceu,ins_com.zhihu.android,ins_com.Qunar,ins_com.eg.android.AlipayGphone,ins_com.airbnb.android,ins_com.lingan.seeyou,ins_com.qicai.translate,ins_com.mt.mtxx.mtxx,ins_vz.com,ins_com.ganji.android,ins_com.google.android.gsf,ins_com.taobao.trip,ins_com.mfw.roadbook,ins_com.tencent.mobileqq', u'act_cn.damai,act_com.taobao.trip,act_com.sankuai.meituan,act_com.google.android.gms,act_com.eg.android.AlipayGphone,act_com.tencent.mm,act_com.sina.weibo,act_com.babytree.apps.pregnancy,act_com.taobao.taobao,act_com.meitu.meipaimv,act_com.mfw.roadbook,act_com.zhihu.android,act_com.mt.mtxx.mtxx', u'inst_ct_21_40', u'installed1', u'inst_cate_ct_13_16', u'active_ct_10_20', u'activ_1', u'phone_price_2500_3500', u''], [u'4ac74594b0fe17b532e7f278', u'25-34', u'ins_com.easysay.japanese,ins_com.tencent.mobileqq,ins_com.eg.android.AlipayGphone,ins_com.google.android.syncadapters.calendar,ins_com.zhaopin.social,ins_com.taobao.taobao,ins_com.kugou.android,ins_com.sina.weibo,ins_com.tencent.qqlive,ins_cmb.pb,ins_com.android.browser,ins_com.baidu.searchbox,ins_com.sohu.inputmethod.sogou,ins_cn.wps.moffice_eng,ins_com.qiyi.video,ins_com.tencent.mm,ins_com.autonavi.minimap,ins_com.luojilab.player,ins_com.liulishuo.engzo', u'act_com.zhaopin.social,act_com.tencent.mm,act_com.sina.weibo', u'inst_ct_0_20', u'installed12,installed9', u'inst_cate_ct_9_12', u'active_ct_4_5', u'activ_12', u'phone_price_801_1500', u'']])

split_data_rdd = data_rdd.map(lambda x: (x[0], x[1], set(x[2].split(","))))

elements_set = sorted(split_data_rdd\
                      .map(lambda x: x[2]).reduce(lambda x,y: x | y))

print elements_set

split_data_rdd_dummy_encoding = split_data_rdd\
     .map(lambda x: (x[0], x[1], [1 if y in x[2] else 0 for y in elements_set]))

print split_data_rdd_dummy_encoding.collect()

结果:

[u'ins_cmb.pb', u'ins_cn.damai', u'ins_cn.wps.moffice_eng', u'ins_com.Qunar', u'ins_com.airbnb.android', u'ins_com.android.browser', u'ins_com.autonavi.minimap', u'ins_com.babytree.apps.pregnancy', u'ins_com.baidu.searchbox', u'ins_com.easysay.japanese', u'ins_com.eg.android.AlipayGphone', u'ins_com.ganji.android', u'ins_com.google.android.gms', u'ins_com.google.android.gsf', u'ins_com.google.android.syncadapters.calendar', u'ins_com.kugou.android', u'ins_com.lemon.faceu', u'ins_com.lingan.seeyou', u'ins_com.liulishuo.engzo', u'ins_com.luojilab.player', u'ins_com.meitu.meipaimv', u'ins_com.mfw.roadbook', u'ins_com.mt.mtxx.mtxx', u'ins_com.qicai.translate', u'ins_com.qiyi.video', u'ins_com.sankuai.meituan', u'ins_com.sina.weibo', u'ins_com.sohu.inputmethod.sogou', u'ins_com.taobao.taobao', u'ins_com.taobao.trip', u'ins_com.tencent.mm', u'ins_com.tencent.mobileqq', u'ins_com.tencent.qqlive', u'ins_com.tencent.qqmusic', u'ins_com.zhaopin.social', u'ins_com.zhihu.android', u'ins_vz.com']

[(u'007896797eed11ba73dd', u'18-24', [0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1]), (u'4ac74594b0fe17b532e7f278', u'25-34', [1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0])]