PySpark:如何并置2列?

问题描述 投票:0回答:2

我有两个DataFrame,每个一列(每行300行):

df_realite.take(1)
[Row(realite=1.0)]
df_proba_classe_1.take(1)
[Row(probabilite=0.6196931600570679)]

我想用两列做一个DataFrame。我试过了 :

    _ = spark.createDataFrame([df_realite.rdd, df_proba_classe_1.rdd]       , 
                               schema=StructType([ StructField('realite'     , FloatType() ) , 
                                                   StructField('probabilite' , FloatType() ) ]))

 _.take(10)

给了我空值:

[Row(realite=None, probabilite=None), Row(realite=None, probabilite=None)]
pyspark
2个回答
0
投票

可能有一种更简洁的方式(或没有连接的方式),但你总是可以给他们两个id并加入他们像:

from pyspark.sql import functions

df1 = df_realite.withColumn('id', functions.monotonically_increasing_id())
df2 = df_proba_classe_1.withColumn('id', functions.monotonically_increasing_id())

df1.join(df2, on='id').select('realite', 'probabilite'))

0
投票

我认为这是你正在寻找的,我只推荐这种方法,如果你的数据非常小,就像在你的情况下(300行),因为collect()不是一个很好的数据大量的做法,否则去加入路线使用虚拟cols并进行广播连接,因此不会发生shuffle

from pyspark.sql.functions import *
from pyspark.sql.types import *

df1 = spark.range(10).select(col("id").cast("float"))
df2 = spark.range(10).select(col("id").cast("float"))

l1 = df1.rdd.flatMap(lambda x: x).collect()
l2 = df2.rdd.flatMap(lambda x: x).collect()
list_df = zip(l1, l2)

schema=StructType([ StructField('realite', FloatType() ) , 
                    StructField('probabilite' , FloatType() ) ])

df = spark.createDataFrame(list_df, schema=schema)
df.show()

+-------+-----------+
|realite|probabilite|
+-------+-----------+
|    0.0|        0.0|
|    1.0|        1.0|
|    2.0|        2.0|
|    3.0|        3.0|
|    4.0|        4.0|
|    5.0|        5.0|
|    6.0|        6.0|
|    7.0|        7.0|
|    8.0|        8.0|
|    9.0|        9.0|
+-------+-----------+
© www.soinside.com 2019 - 2024. All rights reserved.