【问题标题】:How to merge pyspark and pandas dataframes如何合并 pyspark 和 pandas 数据框
【发布时间】:2018-02-28 11:04:49
【问题描述】:

我有一个非常大的 pyspark 数据框和一个较小的 pandas 数据框,如下所示:

df1 = spark.read.csv("/user/me/data1/")
df2 = pd.read_csv("data2.csv")

两个数据框都包含标记为“A”和“B”的列。我想创建另一个 pyspark 数据框,其中只有来自df1 的那些行,其中“A”和“B”列中的条目出现在df2 中具有相同名称的那些列中。即使用df2的“A”和“B”列过滤df1。

通常我认为这是一个连接(使用merge 实现)但是 如何将 pandas 数据框与 pyspark 数据框连接起来?

我无法将 df1 转换为 pandas 数据框。

【问题讨论】:

  • 如何将 pandas 数据帧转换为 pyspark 数据帧?
  • @5nv 你怎么能这样做?我认为类型也有问题。 pyspark 在读取 csv 时似乎不会推断类型。
  • 由于我们对您的 df1df2 在结构上的相似程度一无所知,因此如果您在回答您的另一个(并且可能相关的)问题时提供反馈,将会非常有用: stackoverflow.com/questions/46283021/…

标签: python pandas apache-spark pyspark


【解决方案1】:

您可以使用此代码 sn-p 获得帮助:

df1 = spark.read.csv("/user/me/data1/")
df2 = pd.read_csv("data2.csv", keep_default_na=False)
df3 = df = sqlContext.createDataFrame(df2, schema)
df = df1.join(df3, ["A", "B"])

【讨论】:

    【解决方案2】:

    您可以在从 pandas 数据帧转换为 pyspark 数据帧时传递架构,如下所示:

    from pyspark.sql.types import *
    schema = StructType([
    StructField("name", StringType(), True),
    StructField("age", IntegerType(), True)])
    df = sqlContext.createDataFrame(pandas_dataframe, schema)
    

    或者你可以使用我在这个函数中使用的 hack:

    def create_spark_dataframe(file_name):
        """
        will return the spark dataframe input pandas dataframe
        """
        pandas_data_frame = pd.read_csv(file_name)
        for col in pandas_data_frame.columns:
          if ((pandas_data_frame[col].dtypes != np.int64) & (pandas_data_frame[col].dtypes != np.float64)):
            pandas_data_frame[col] = pandas_data_frame[col].fillna('')
    
        spark_data_frame = sqlContext.createDataFrame(pandas_data_frame)
        return spark_data_frame
    

    【讨论】:

    • createDataFrame() 调用上是否发生了某种隐式转换?什么机制允许在该调用中从 pandas df 转换为 spark df?
    • 我试了一下:更正了一个缩进错误,然后得到了这个:ValueError: can not infer schema from empty dataset
    • 在这个函数中你提供了带有标题的 csv 文件名,对吗?
    • 啊!我的错。我习惯了 parquet 自动完成它
    • 关于您的第一个问题,我有一些想法,但会对此进行更多研究,并将分享结果,必须确定何时回答:)
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2021-11-17
    相关资源
    最近更新 更多