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

时间:2020-05-13 17:49:18

标签: python apache-spark pyspark apache-spark-sql pyspark-dataframes

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

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

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], [...|
+---------------------+--------------------+--------------------+--------------------+--------------------+

有可能吗? 如果可能的话,怎么办?

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

由于数据量很大(2-3 GB),而熊猫速度太慢,因此不能使用熊猫。我在本地计算机上运行pyspark。

提前谢谢! :)

1 个答案:

答案 0 :(得分:1)

这些是我建议的两个选择

Option1(用于构建字典的联合用例):

您说过,您有> = 10个表(要从中构建字典),这些表具有公用列(例如'schoolName','type','avgCostAcademicYear','avgCostProgramYear','averageNetPricePublic'是常见的列),则可以使用 union unionByName 形成单一合并。数据视图。

例如:

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)

请注意错过任何联接列将导致笛卡尔积