所以我想从目录中读取csv文件,作为pyspark数据帧,然后将它们附加到单个数据帧中。 在pyspark中没有得到替代品,就像我们在熊猫中所做的那样。
例如在Pandas中,我们这样做:
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)
非常感谢任何帮助。
由于
答案 0 :(得分:7)
在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)
答案 1 :(得分:2)
在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)
答案 2 :(得分:1)
首先为空数据框定义适当的架构,然后在其中添加其他数据。 例如-
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)
答案 3 :(得分:0)
首先定义模式,然后您可以使用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)
答案 4 :(得分:0)
这是我的方法。我不会创建一个空的DataFrame。
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
答案 5 :(得分:0)
你可以在这里使用一个空的 DataFrame。 创建一个空列表并继续向其中添加子 DataFrame。添加完要组合的所有 DataFrame 后,使用 union 对列表执行 reduce,它会将所有数据组合成一个 DataFrame。
list_of_dfs = []
for i in number_of_dfs:
list_of_dfs.append(df_i)
combined_df = reduce(DataFrame.union, list_of_dfs)