Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SPARK 2.2.2-连接多个RDD,导致内存不足异常。结果RDD有124列。最佳连接方法应该是什么?_Python_Apache Spark_Pyspark - Fatal编程技术网

Python SPARK 2.2.2-连接多个RDD,导致内存不足异常。结果RDD有124列。最佳连接方法应该是什么?

Python SPARK 2.2.2-连接多个RDD,导致内存不足异常。结果RDD有124列。最佳连接方法应该是什么?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个文件,每个电话号码有多个值。例如: phone_no circle operator priority1 attribute1 attribute2 attribute3 priority2 attribute1 attribute2 attribute3 123445 delhi airtel 1.0 info1 info2 info3 1.1 info4 info5 info6 987654

我有一个文件,每个电话号码有多个值。例如:

phone_no circle operator priority1 attribute1 attribute2 attribute3 priority2 attribute1 attribute2 attribute3 
123445   delhi  airtel   1.0        info1      info2      info3      1.1        info4      info5      info6
987654   bhopal idea     1.1        info1      info2      info3      1.4        info4      info5      info6
123445   delhi  airtel   1.3        info1      info2      info3      1.0        info4      info5      info6
我的预期产出是: 对于每个电话号码,选择最小P1及其对应的属性值

正如我上面的示例所述,对于电话号码123445,第1行中的P1小于第3行中的P1 1.0<1.3,因此我想从第1行中选择属性1、2和3,而第3行中的P2的值小于1.0<1.1,因此我想从第3行中选择属性值

以下是我想要的表格格式:

phone_no circle operator priority1 attribute1 attribute2 attribute3 priority2 attribute1 attribute2 attribute3 
123445   delhi  airtel   1.0        info1      info2      info3      1.0        info4      info5      info6
987654   bhopal idea     1.1        info1      info2      info3      1.4        info4      info5      info6
我有25个不同的优先级值,每个优先级值有4个不同的属性,所以我的总列数约为125

到目前为止,我所尝试的:

创建一个数据帧,其中电话号码作为键,每个优先级值的最小值。 创建另一个数据帧,该数据帧的值为minPriority1,并为每个电话号码创建相应的属性。 创建另一个数据帧,该数据帧的值为minPriority2,并为每个电话号码创建相应的属性。 将电话号码上的这两个数据帧连接起来,以获取完整信息并将此数据帧保存到磁盘。 我的方法的问题是,考虑到我拥有的列的数量,它不是一个好方法。请给我建议一些解决这个问题的好方法


编辑1:这是我所做的粘贴库链接:

我可能会使用窗口功能:

from pyspark.sql.window import Window
import pyspark.sql.functions as spf

df = spark.createDataFrame([
    (123, 1, 'a', 2, 'c'),
    (123, 2, 'b', 1, 'd'),
    (456, 3, 'e', 4, 'f')
], ['phone', 'priority1', 'attribute1', 'priority2', 'attribute2'])

w = Window.partitionBy('phone')
df2 = (
    df
    .select(
        'phone',
        spf.first('attribute1').over(w.orderBy('priority1')).alias('attribute1'),
        spf.first('attribute2').over(w.orderBy('priority2')).alias('attribute2'),
    )
)

(
    df2
    .groupby('phone')
    .agg(*[spf.first(c).alias(c) for c in df2.columns if c != 'phone'])
    .toPandas()
)
给出:

   phone attribute1 attribute2
0    123          a          d
1    456          e          f

这是一个让读者将其模板化的练习,例如,使用列表理解来概括所有属性和优先级。

您能显示代码吗?请检查上面的pastebin链接。谢谢你抽出时间。我会在周一试用,然后再给你回复。谢谢你抽出时间!这很好用!非常感谢你。实际上,我最初的问题是。我有一个旧版本的配置单元,因此无法使用merge命令。所以我想创建一个包含合并记录的文件,然后使用配置单元连接查询来获得最终结果。我已经接受了你的答案。