我有一个非常大的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
实现)但是 你如何加入一个pyspark数据框的pandas数据框?
我无法将df1
转换为pandas数据帧。
答案 0 :(得分:6)
您可以在从pandas dataframe转换为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
答案 1 :(得分:1)
您可以使用以下代码段获取帮助:
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"])