博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PySpark DataFrame创建透视表
阅读量:6092 次
发布时间:2019-06-20

本文共 4093 字,大约阅读时间需要 13 分钟。

hot3.png

运行效果:

数据处理前

+---+------+---+---+---+-----+---+|  a|family|  i|  m|  n|wsdtf|wtf|+---+------+---+---+---+-----+---+| ad|   CPU|  h|  s|  t|    h|  h||ad1|   GPU|  h|  d|  y|    c|  b||ad2|Memory|  h|  s|  u|    b|  b||ad2|   SSD|  6|  s|  i|    h|  h|| ad|   HHD|  6|  d|  i|    c|  b|+---+------+---+---+---+-----+---+

数据处理后:

+---+---+------+---+---+---+-----+-------+-------+---+---+-------+---+---+-----+|  a|n_y|family|i_h|n_t|n_u|wtf_b|wsdtf_b|wsdtf_c|m_d|n_i|wsdtf_h|m_s|i_6|wtf_h|+---+---+------+---+---+---+-----+-------+-------+---+---+-------+---+---+-----+| ad|  0|   CPU|  1|  1|  0|    0|      0|      0|  0|  0|      1|  1|  0|    1||ad1|  1|   GPU|  1|  0|  0|    1|      0|      1|  1|  0|      0|  0|  0|    0||ad2|  0|Memory|  1|  0|  1|    1|      1|      0|  0|  0|      0|  1|  0|    0||ad2|  0|   SSD|  0|  0|  0|    0|      0|      0|  0|  1|      1|  1|  1|    1|| ad|  0|   HHD|  0|  0|  0|    1|      0|      1|  1|  1|      0|  0|  1|    0|+---+---+------+---+---+---+-----+-------+-------+---+---+-------+---+---+-----+

用于把每列中每种标签生成1和0形式的feature,供机器学习训练使用:

if __name__ == '__main__':    conf = SparkConf()    conf = conf.setMaster("local[*]")    conf = conf.set('spark.sql.warehouse.dir', 'file:///d:/tmp')    spark = SparkSession.builder.appName("Test PredictionTool").config(conf=conf).getOrCreate()    sc = spark.sparkContext    sc.setLogLevel("ERROR")    df_p = pd.DataFrame({"a": ["ad", "ad1", "ad2", "ad2", "ad"],                         "n": ["t", "y", "u", "i", "i"],                         "m": ["s", "d", "s", "s", "d"],                         "i": ["h", "h", "h", "6", "6"],                         "wtf": ["h", "b", "b", "h", "b"],                         "wsdtf": ["h", "c", "b", "h", "c"],                         "family": ["CPU", "GPU", "Memory", "SSD", "HHD"]})    df = spark.createDataFrame(df_p)    def row_to_dict(row):        dict_row = row.asDict()        for k in dict_row:            v = dict_row[k]            s = set()            s.add(v)            dict_row[k] = s        return dict_row    def reduce_dict(dict_r_1, dict_r_2):        dict_result = dict()        for k1 in dict_r_1:            s1 = dict_r_1[k1]            if k1 in dict_r_2:                s2 = dict_r_2[k1]                assert isinstance(s1, set)                assert isinstance(s2, set)                s = set(s1 | s2)                dict_result[k1] = s            else:                dict_result[k1] = s1        for k2 in dict_r_2:            if k2 not in dict_r_1:                s2 = dict_r_2[k2]                dict_result[k2] = s2        return dict_result    dict_diff_row = df.rdd.map(lambda r: row_to_dict(r)).reduce(lambda a, b: reduce_dict(a, b))    print dict_diff_row    def map_to_extend_row(row, dict_diff_row, except_col_list=None):        dict_row = row.asDict()        dict_result = dict()        for k in dict_diff_row:            if except_col_list is not None:                assert isinstance(except_col_list, list)                if k in except_col_list:                    dict_result[k] = dict_row[k]                else:                    if k in dict_row:                        data_set = dict_diff_row[k]  # r1 -> a,b,c                        target_value = dict_row[k]                        assert isinstance(data_set, set)                        for col in data_set:                            row_name = k + "_" + col                            if col == target_value:                                dict_result[row_name] = 1                            else:                                dict_result[row_name] = 0                    else:                        data_set = dict_diff_row[k]  # r1 -> a,b,c                        for col in data_set:                            row_name = k + "_" + col                            dict_result[row_name] = 0        columns = dict_result.keys()        v = dict_result.values()        row_o = Row(*columns)        return row_o(*v)    df.show()    df.rdd.map(lambda r: map_to_extend_row(r, dict_diff_row, ["family", "a"])).toDF().show()

 

转载于:https://my.oschina.net/u/2996334/blog/1795319

你可能感兴趣的文章
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
上传jar包到nexus私服
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Project:如何分析项目中的资源分配情况
查看>>
HDU 4803 Poor Warehouse Keeper (贪心+避开精度)
查看>>
小错误汇总
查看>>
Spring源码系列 — Envoriment组件
查看>>
java正则表达式去除html标签,Java中正则表达式去除html标签
查看>>
使用Cobbler批量部署Linux操作系统
查看>>
zabbix企业应用之服务端与客户端的安装
查看>>
实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
查看>>
无法在web服务器上启动调试。调试失败,因为没有启用集成windows身份验证
查看>>
Bat相关的项目应用
查看>>
Django为数据库的ORM写测试例(TestCase)
查看>>
NYOJ-107 A Famous ICPC Team
查看>>
与众不同 windows phone (44) - 8.0 位置和地图
查看>>
Visual Studio Code 使用 ESLint 增强代码风格检查
查看>>