我该如何让熊猫和星火团一起工作



在pandas中的主要问题是它无法处理大型操作数据,大量CSV文件内存不足,现在我在Hadoop中切换到pyspark 1.6,我尝试过使用dask.dataframe,但问题仍然存在,有什么原因让pandas与Hadoop集群或pyspark集群一起工作吗?我想将此功能与pandas 一起使用

import pandas as pd
df = pd.read_csv('text1.txt',names =['DATE','IMSI','WEBSITE','LINKUP','LINKDOWN','COUNT','CONNECTION'])
df.columns.str.strip()
df.DATE = pd.to_datetime(df.DATE)
group = df.groupby(['IMSI','WEBSITE']).agg({'DATE':[min,max,'count']
,'LINKUP':'sum'
, 'LINKDOWN':'sum'
, 'COUNT':'max'
,'CONNECTION':'sum'
})
group.to_csv('finalinfo.txt', index = True, header = False)

从HDFS读取数据,聚合并发送回panda。下面的示例使用inferSchema来获取基于数据的列名和类型,但若文件并没有标题或者不喜欢它推断的类型,则可以提供自己的模式。InferSchema需要额外的传递数据,因此根据数据大小,您可能需要提供自己的模式,而不考虑:

from pyspark.sql import functions as f
df = spark.read.csv('/hdfs/path/to/text1.txt', header=1, inferSchema=True, sep=';') 
df = df.groupBy('IMSI','WEBSITE').agg(f.min('DATE').alias('min of date'),
f.max('DATE').alias('max of date'),
f.count('DATE').alias('count of date'),
f.sum('LINKUP').alias('sum of linkup'),
f.sum('LINKDOWN').alias('sum of linkdown'),
f.count('COUNT').alias('count of count'),
f.sum('CONNECTION').alias('sum of connection'))
pandasDF = df.toPandas()

或者,如果文件对熊猫来说仍然太大,您可以使用spark保存到csv。请注意,您无法控制输出文件的名称-您只指定将创建并存储输出的目录位置,文件名将遵循临时文件命名的spark约定:

df.coalesce(1).write.csv('/hdfs/path/to/output/directory', header=True)

coalize(1)可以获得单个文件作为输出,因为spark将创建与分区相等的文件数量(默认为200 iirc)。为了实现这一点,未分区的文件必须适合单个工作者的内存。如果它仍然太大,不要使用聚结。Spark会将其保存在多个文件中,然后您可以使用HDFSgetmerge在词尾连接这些文件。

相关内容

  • 没有找到相关文章

最新更新