将列字典从不同的数据帧转换为数据帧:pyspark

Posted

技术标签:

【中文标题】将列字典从不同的数据帧转换为数据帧:pyspark【英文标题】:Convert dictionary of columns to Dataframe in from different dataframes : pyspark 【发布时间】:2020-05-13 17:49:18 【问题描述】:

我正在尝试将来自不同数据框的列合并为一个以进行分析。我正在将我需要的所有列收集到字典中。

我现在有一本这样的字典 -

newDFDict = 
    'schoolName': school.INSTNM,
    'type': school.CONTROL,
    'avgCostAcademicYear': costs.COSTT4_A, 
    'avgCostProgramYear': costs.COSTT4_P, 
    'averageNetPricePublic': costs.NPT4_PUB, 



 'schoolName': Column<b'INSTNM'>,
 'type': Column<b'CONTROL'>,
 'avgCostAcademicYear': Column<b'COSTT4_A'>,
 'avgCostProgramYear': Column<b'COSTT4_P'>,
 'averageNetPricePublic': Column<b'NPT4_PUB'>

我想将此字典转换为 Pyspark 数据框。

我已经尝试过这种方法,但输出不是我所期望的 -

newDFDict = 
    'schoolName': school.select("INSTNM").collect(),
    'type': school.select("CONTROL").collect(),
    'avgCostAcademicYear': costs.select("COSTT4_A").collect(), 
    'avgCostProgramYear': costs.select("COSTT4_P").collect(), 
    'averageNetPricePublic': costs.select("NPT4_PUB").collect(), 


newDF = sc.parallelize([newDFDict]).toDF()
newDF.show()
+---------------------+--------------------+--------------------+--------------------+--------------------+
|averageNetPricePublic| avgCostAcademicYear|  avgCostProgramYear|          schoolName|                type|
+---------------------+--------------------+--------------------+--------------------+--------------------+
| [[NULL], [NULL], ...|[[NULL], [NULL], ...|[[NULL], [NULL], ...|[[Community Colle...|[[1], [1], [1], [...|
+---------------------+--------------------+--------------------+--------------------+--------------------+

有可能吗? 如果可能,怎么做?

这是正确的方法吗?如果没有,我该如何实现?

使用 pandas 不是一个选项,因为数据非常大(2-3 GB)而且 pandas 太慢了。我在本地机器上运行 pyspark。

提前致谢! :)

【问题讨论】:

您可能已经使用公共键加入了 2 个数据框,然后 .... 您可以选择所谓的字典所需的列,对吗?两个数据框都没有共同的列吗?如果数据更多,collect 是 OOM 的杀手锏。 @RamGhadiyaram 有 10 个表,总共超过 1900 列。我在想,与其加入 10 个表并选择 40-50 列,不如通过字典来完成。 joinunion with all common columns 有什么问题视图/数据框?大不收集...您将所有数据拉入驱动程序因此OOM 我不明白你想说什么。另外我应该提到唯一的共同键是行号。 看我的例子,如果你没有加入键,你可以按照下面的答案进行联合,这是你常见的 dict 字段的 sql 表示 【参考方案1】:

这是我建议的 2 个选项

Option1(建立字典的联合大小写):

您说,您有 >=10 个表(您想从中构建字典),这些表具有常见的列(例如 'schoolName'、'type' 'avgCostAcademicYear' 、'avgCostProgramYear' 、'averageNetPricePublic' columns )然后你可以去 unionunionByName 形成单一的合并。数据视图。

例如:

select 'schoolName','type' 'avgCostAcademicYear' ,'avgCostProgramYear' , 'averageNetPricePublic' from df1

 union  

select 'schoolName','type' 'avgCostAcademicYear' ,'avgCostProgramYear' , 'averageNetPricePublic' from df2
 ....
union
select 'schoolName','type' 'avgCostAcademicYear' ,'avgCostProgramYear' , 'averageNetPricePublic' from dfN 

将为您提供字典的统一视图

选项 2:(如果您只有公共连接列)

如果您有一些常见的连接列,那么无论存在多少表,您也可以使用标准连接..

对于伪 sql 示例:

select dictionary columns from table1,table2,table3,... tablen where join common columns in all tables (table1... tablen)

注意错过任何连接列都会导致笛卡尔积

【讨论】:

唯一常见的列是行号。没有公共列 可能不加入你的意思是工会不会工作?你试过了吗? 我不是在从每个表中选择列之后创建字典,而是在使用 monotically_increasing_id() 创建一个包含 reqd 列的新数据框后加入。所以选项2 你的单调递增的id不是增量的,因为sql行号小心看我的回答here 无论如何我都打算放弃它。它不会导致加入问题,对吗? (我问的是不匹配的连接)

以上是关于将列字典从不同的数据帧转换为数据帧:pyspark的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 将 json 数组转换为数据帧行

Pyspark 将 rdd 转换为具有空值的数据帧

将 pyspark 数据帧转换为 pandas 数据帧

通过 pyspark.sql.dataframe 将 XML 数据转换为 pandas 数据帧

在 Pyspark 中将 Pandas 数据帧转换为 Spark 数据帧的 TypeError

将 numpy 数组的 rdd 转换为 pyspark 数据帧