Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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
我如何在Pyspark中定义一个空的数据帧并附加相应的数据帧?_Pyspark_Pyspark Sql - Fatal编程技术网

我如何在Pyspark中定义一个空的数据帧并附加相应的数据帧?

我如何在Pyspark中定义一个空的数据帧并附加相应的数据帧?,pyspark,pyspark-sql,Pyspark,Pyspark Sql,所以我想从一个目录中读取csv文件,作为pyspark数据帧,然后将它们附加到单个数据帧中。 在Pypark中没有替代品,就像我们在熊猫身上做的那样 例如,在熊猫中,我们做: files=glob.glob(path +'*.csv') df=pd.DataFrame() for f in files: dff=pd.read_csv(f,delimiter=',') df.append(dff) 在Pyspark中,我尝试过这一点,但没有成功 schema=Struct

所以我想从一个目录中读取csv文件,作为pyspark数据帧,然后将它们附加到单个数据帧中。 在Pypark中没有替代品,就像我们在熊猫身上做的那样

例如,在熊猫中,我们做:

files=glob.glob(path +'*.csv')

df=pd.DataFrame() 

for f in files:
    dff=pd.read_csv(f,delimiter=',')
    df.append(dff)
在Pyspark中,我尝试过这一点,但没有成功

schema=StructType([])
union_df = sqlContext.createDataFrame(sc.emptyRDD(),schema)

for f in files:
    dff = sqlContext.read.load(f,format='com.databricks.spark.csv',header='true',inferSchema='true',delimiter=',')
    df=df.union_All(dff)
非常感谢您的帮助


谢谢

在2个数据帧上使用“unionAll”时,模式应该相同。因此,空数据帧的模式应与csv模式一致

例如:

schema = StructType([
    StructField("v1", LongType(), True), StructField("v2", StringType(), False), StructField("v3", StringType(), False)
])
df = sqlContext.createDataFrame([],schema)
或者你可以这样做:

f = files.pop(0)
df = sqlContext.read.load(f,format='com.databricks.spark.csv',header='true',inferSchema='true',delimiter=',')
for f in files:
    dff = sqlContext.read.load(f,format='com.databricks.spark.csv',header='true',inferSchema='true',delimiter=',')
    df=df.union_All(dff)

在spark 2.1中,实现此目的的一种方法如下所示:

files=glob.glob(path +'*.csv')

for idx,f in enumerate(files):
    if idx == 0:
        df = spark.read.csv(f,header=True,inferSchema=True)
        dff = df
    else:
        df = spark.read.csv(f,header=True,inferSchema=True)
        dff=dff.unionAll(df)

首先定义模式,然后可以使用unionAll将新数据帧连接到空数据帧,甚至可以运行迭代将一组数据帧组合在一起

from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType

sc = SparkContext(conf=SparkConf())
spark = SparkSession(sc)     # Need to use SparkSession(sc) to createDataFrame

schema = StructType([
    StructField("column1",StringType(),True),
    StructField("column2",StringType(),True)
])
empty = spark.createDataFrame(sc.emptyRDD(), schema)

empty = empty.unionAll(addOndata)

我是这样做的。我不会创建一个空的数据帧

def concat_spark_iterator(iterator):
    """
    :param iterator: iterator(Spark DataFrame)   
    :return: Concatenated Spark DataFrames
    """

    df = next(iterator)

    for _df in iterator:
        df = df.union(_df)

    return df
list_of_dfs = []
for i in number_of_dfs:
    list_of_dfs.append(df_i)
combined_df = reduce(DataFrame.union, list_of_dfs)

首先为空数据框定义适当的模式,然后在其中附加其他数据。 比如说-

schema = StructType([
    StructField("phrase",StringType(),True),
    StructField("count_tf",ArrayType(StructType([
        StructField("count", IntegerType(), True),
        StructField("tf", DoubleType(), True)
    ])),True)])
empty = spark.createDataFrame(sc.emptyRDD(), schema)
empty.printSchema()

root 
 |-- phrase: string (nullable = true)
 |-- count_tf: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- count: integer (nullable = true)
 |    |    |-- tf: double (nullable = true)
然后检查需要以空格式追加的数据帧的模式。两个模式应该相同。现在,您可以轻松地将数据帧附加到空数据帧中

for f in files:
    dff = sqlContext.read.load(f)
    empty=empty.union(dff)

您可以在这里获得一个空的数据帧。 创建一个空列表并继续向其中添加子数据帧。添加完所有要合并的数据帧后,对列表执行reduce using union,它将所有数据帧合并到一个数据帧中

def concat_spark_iterator(iterator):
    """
    :param iterator: iterator(Spark DataFrame)   
    :return: Concatenated Spark DataFrames
    """

    df = next(iterator)

    for _df in iterator:
        df = df.union(_df)

    return df
list_of_dfs = []
for i in number_of_dfs:
    list_of_dfs.append(df_i)
combined_df = reduce(DataFrame.union, list_of_dfs)

代码的最后一行应该是:df=df.unionAll(dff)
empty=spark.createDataFrame(sc.emptyRDD(),schema)
就是我要找的。谢谢这将返回
name错误:未定义名称“reduce”
您必须导入“reduce”: