pyspark.dataframe与pandas.dataframe大概目前机器学习算子中最长用到的数据结构了,本文来讲讲各自的常用操作和两者间相互转换。
pyspark
- 创建spark-session
1 | from pyspark.sql import SparkSession |
- 通过pyspark-sql进行数据查询、聚合、统计
1 | df = session.sql("select * from table_name") |
- dataframe数据落地保存
1 | // 类似的常用的方法还有saveAsPickleFile |
- 重新读取落地的文件
1 | // p类型为list |
- 重新回到dataframe
1 | df = session.createDataFrame(p) |
- datafram实例化
1 | // csv to dataframe |
- pyspark.dataframe to pandas.dataframe
1 | pdf = df.toPandas() |
pandas
- pandas.dataframe 实例化
1 | import pandas as pd |
- dataframe to csv
1 | pdf.to_csv(file_path, index=False) |
- pandas.dataframe to pyspark.dataframe
1 | // session的声明方式见上文 |
- pdf to string
1 | s = pdf.to_string() |
复杂问题
spark.dataframe如何实现多机同步
正常情况下通过df.write
落hdfs(上层可能基于hive或者spark-sql)实现共享。
但若要跨集群共享就要另想办法了。
解决方案就是将落地数据单独传输:
1、df -> hdfs -> local file -> internet
2、df -> pdf -> byte or string -> internet
显然第二种方法只需要落地一次,更优
1 | # spark df to pandas df |
pandas.dataframe数据精度问题
当pandas.dataframe to_csv或者转为pysprk.dataframe时,会默认进行精度转换,
to_csv中提供了指定精度的参数,然而每列特征的精度本就可能不一致,所以最好还是完整保留当前的数据内容。
解决方案:
1、通过float_format指定最长有效数字,g
不补零,f
补零
1 | pdf.to_csv(file_path, index=False, float_format="%.10g") |
2、使用pdf.to_string
的方式,保存数据快照,然后手动进行数据转换为csv。