热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:数据分析工具篇——Pyspark实现PCA主成分

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数据分析工具篇——Pyspark实现PCA主成分相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数据分析工具篇——Pyspark实现PCA主成分相关的知识,希望对你有一定的参考价值。








代码概览








数据分析工具篇——Pyspark实现PCA主成分






    Pyspark是近段时间笔者接触到的比较高效的大数据处理工具,他的亮点是整理出了数据分析过程中两个最高频应用的工具:pandas的DataFrame包和sklearn包,能够方便的完成数据处理及模型构建两块内容,上一篇笔者整理了Pyspark的常规用法,本篇以一个案例的形式串联一下pyspark的内容:

    在小数据集中构建一个PCA模型是非常方便的,DataFrame构建完成后直接调用sklearn的PCA包即可,那么,在大数据集中是否也是这样方便呢?

    回答是肯定的,这也是pyspark方便的地方~

    原理依然如此,不过步骤上添加了几个环节,毕竟数据集获取就不能直接read_csv了,而是从hive库中提取需要的数据集,我们看完整的代码:
















































#!/usr/bin/env python # _*_ UTF-8 _*_ # 个人公众号:livandata from pyspark.ml.feature import PCA as PCAml from pyspark.ml.feature import VectorAssembler from pyspark.sql import SparkSession spark = SparkSession\ .builder\ .appName("PythonWordCount")\ .master("local") \ .getOrCreate() spark.conf.set("spark.executor.memory", "500M") sc = spark.sparkContext # 1)数据获取: # sqlDF = spark.sql("SELECT a, b, collect_list(c) FROM table GROUP BY a, b") data = spark.createDataFrame([[1,3,[2,3,5,6,7,6,4,6]],[4,6,[5,5,6,7,6,3,1,6]],[7,9,[8,5,3,5,6,7,6,8]]], ['a','c','b']) # 2)将list转化成向量: length = len(data.select('b').take(1)[0][0]) assembler_exploded = VectorAssembler( inputCols=["b[{}]".format(i) for i in range(length)], outputCol="b_vector" ) df_exploded = data.select( data["a"], *[data["b"][i] for i in range(length)] ) converted_df = assembler_exploded.transform(df_exploded) final_df = converted_df.select("a", "b_vector") # 3)PCA计算: pca = PCAml(k=7, inputCol="b_vector", outputCol="pca") model = pca.fit(final_df) transformed = model.transform(final_df) print(transformed.show()) # 4)将向量转化成list存储: def extract(row): return (row.a,) + (row.b_vector,) + (row.pca,) + tuple(row.pca.toArray().tolist()) transformed_list = transformed.rdd.map(extract).toDF(["a", "b_vector", "pca"]) transformed_list = transformed_list.selectExpr("a", "b_vector", "pca", "_4 as pca_1", "_5 as pca_2", "_6 as pca_3","_7 as pca_4", "_8 as pca_5", "_9 as pca_6", "_10 as pca_7") print(transformed_list.show())# 5)将数据存储到hive中:try: transformed_list.write.format("orc").mode("append").saveAsTable("tmp_db.table") except Exception as e: raise e



有没有被上面这长的代码吓到?


不用紧张,这只是一段看似复杂的简单逻辑,我们来逐一分解一下:











逻辑分解






数据分析工具篇——Pyspark实现PCA主成分


数据分析工具篇——Pyspark实现PCA主成分







第一部分SparkSessionsparkContext我们就不做描述了,每一pyspark代码总以这两个结构开始,主要是为pyspark定义运行环境。


1) 数据收集提取部分:


数据收集提取是我们将数据从数据库中提取到spark环境中进行运算。


我们假定表中的数据结构为:



数据分析工具篇——Pyspark实现PCA主成分


需要做PCA的列为C列,因此将C列行变向量,为简化代码,我们需要尽可能的将数据处理压缩在Hive阶段,俗话说的好:SQL写的好,python写的少,毕竟,python的运行效率并不乐观。


数据处理的SQL如下:








SELECT a, b, collect_list(c)FROM tableGROUP BY a, b




经过这一处理,数据结构变成了:


数据分析工具篇——Pyspark实现PCA主成分


通过spark.SQL函数提取后,我们在spark环境中看到的数据结构即为上图数据。


由于笔者测试环境没有hive环境,因此采用了折中的方式,直接列出数据内容,如上代码:






[[1,3,[2,3,5,6,7,6,4,6]],[4,6,[5,5,6,7,6,3,1,6]],[7,9,[8,5,3,5,6,7,6,8]]]



2) 将list转化为向量:


   数据提取到spark环境后就需要将数据中的list数据转化成vector结构,因为主成分分析需要输入的是vector数据结构,而不是list结构。


    好在pyspark中提供了向量化的工具VectorAssembler,这一过程相对比较复杂,需要按照VectorAssembler的格式梳理好数据结构,然后再将数据输入其中进行transform操作















length = len(data.select('b').take(1)[0][0])assembler_exploded = VectorAssembler( inputCols=["b[{}]".format(i) for i in range(length)], outputCol="b_vector")df_exploded = data.select( data["a"], *[data["b"][i] for i in range(length)])converted_df = assembler_exploded.transform(df_exploded)final_df = converted_df.select("a", "b_vector")



得到的final_df即为转化之后的向量。


3) PCA的计算:


   向量转化完成后,PCA的训练呼之欲出了,pyspark继承了sklearn高度封装的特点,使用起来非常便利,对应的代码逻辑为:









pca = PCAml(k=7, inputCol="b_vector", outputCol="pca")model = pca.fit(final_df)transformed = model.transform(final_df)print(transformed.show())



   定义PCA,训练,然后转化,整个过程简洁高效,运算完成的数据会呈现在数据表新的列中:


数据分析工具篇——Pyspark实现PCA主成分


4) 将向量转化成list:


   数据总是需要以较为简洁的数据结果存储,以方便后期特征的处理和应用,越是高级的数据特性对应的应用范围越小,因此,我们在进行数据存储时将vector结构转化成list结构并拆分到各个列中:









def extract(row): return (row.a,) + (row.b_vector,) + (row.pca,) + tuple(row.pca.toArray().tolist())transformed_list = transformed.rdd.map(extract).toDF(["a", "b_vector", "pca"])print(transformed_list.show())



经过上面的计算,我们得到的结果为:


数据分析工具篇——Pyspark实现PCA主成分


由于hive表中列名很少用“_”作为列名首字母,所以需要将列名修改一下,使用的函数为selectExpr,操作完成后形成的最终结构为:




5) 将数据存储到hive表中:


   形成的数据结构可以直接被存储到hive数据库中,而对应的存储过程为:









try: transformed_list.write.format("orc").mode("append").saveAsTable("tmp_db.table") except Exception as e: raise e


    pyspark中的存储也是非常简单的,整个流程可以看出,pyspark在与hive的交互过程中优化的非常简单,操作起来也非常的高效。


    经过上面的整个步骤,你有没有对pyspark有一个初步的认知呢?


    或者有哪些常用的应用场景,欢迎大家来聊,一起探索高效的写法~



欢迎大家关注公众号:





来都来了,点个关注再走呗~



推荐阅读
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 本文详细介绍了如何使用 Python 进行主成分分析(PCA),包括数据导入、预处理、模型训练和结果可视化等步骤。通过具体的代码示例,帮助读者理解和应用 PCA 技术。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文介绍如何通过 Python 的 `unittest` 和 `functools` 模块封装一个依赖方法,用于管理测试用例之间的依赖关系。该方法能够确保在某个测试用例失败时,依赖于它的其他测试用例将被跳过。 ... [详细]
  • 利用Python进行学生学业表现评估与成绩预测分析
    利用Python进行学生学业表现评估与成绩预测分析 ... [详细]
  • 利用 Python 中的 Altair 库实现数据抖动的水平剥离分析 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Python爬虫数据导出至CSV及图片存储技术详解
    Python爬虫数据导出至CSV及图片存储技术详解 ... [详细]
  • 脑机接口技术在物联网行业中的应用与前景分析
    近期,国际研究人员开发了一种轻便的脑电图(EEG)采集与信号处理系统,并在物联网领域进行了初步应用研究。该系统配备了8个可扩展的采集电极和1个参考电极,具备高灵敏度的放大功能,能够有效捕捉和处理脑电信号。通过与物联网技术的结合,该系统有望在智能家居、健康监测和人机交互等领域发挥重要作用,展现出广阔的应用前景。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • Python 数据分析领域不仅拥有高质量的开发环境,还提供了众多功能强大的第三方库。本文将介绍六个关键步骤,帮助读者掌握 Python 数据分析的核心技能,并深入探讨六款虽不广为人知但却极具潜力的数据处理库,如 Pandas 的替代品和新兴的可视化工具,助力数据科学家和分析师提升工作效率。 ... [详细]
author-avatar
王叶-诺_714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有