开发者社区> 问答> 正文

有没有办法优化使用pandas读取TSV文件,转换并使用spark写入表的代码?

df_pandas = pd.read_csv('filepath/filename' , delimiter='t' , encoding = 'utf-8', error_bad_lines=False )

#defining the schema for the spark dataframe
df_schema_file = StructType([StructField("Col1", StringType(), True),StructField("Col2", StringType(), True)])

spark_df = spark.createDataFrame(df_pandas,df_schema_file)
spark_df = spark_df.withColumn("CreatedOn", lit(from_unixtime(unix_timestamp())))
spark_df = spark_df.withColumn("CreatedOn", spark_df["CreatedOn"].cast(TimestampType()))
spark_df.write.mode('append').saveAsTable('tbl_name')
#Creating dataframe from existing table
spark_df = spark.table('tbl_name')
df_name = spark_df.toPandas()

我使用上面的代码来读取TSV文件,使用Databricks中的数据创建一个permenant表。这就是为什么需要转换为spark数据帧。我还必须将创建的时间戳添加到表中并指定Timestamp数据类型。我不希望它被视为字符串。

然后我需要从表中创建一个pandas数据帧,这样我就可以对数据进行一些简单的转换。应该从现有表中创建pandas数据帧。

现在,这段代码需要2.48分钟才能在数据库中运行。它太多,因为我不使用代码创建新的时间戳列并指定其数据类型,在6秒内完成。

有没有办法优化这段代码?我不知道是否有任何方法可以将pandas数据帧直接保存为表格。因此转换为spark数据帧。我需要在Pandas数据帧本身进行转换。我不知道从表直接创建pandas数据帧的方法。因此先要到spark,然后再到pandas。

有没有办法优化这段代码?

展开
收起
社区小助手 2018-12-21 11:02:08 2634 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    spark中有两个概念需要先了解:

    转换 - 这意味着创建一个或多个其他RDD的延迟操作。这意味着没有任何实际执行的计划。

    动作 - 产生像toPandas()这样的非RDD结果实际上执行所有转换计划。参考

    关于执行的时间,Spark开始执行任何任务都有很大的开销。但是当它与更大的任务相关时,它会获得更好的性能。有很多情况下spark会比pandas或numpy慢。但是当你到达一个特定的大数据案例时,Spark的执行速度将比任何本地执行都要快。如果你使用像这样的小型数据集的单台机器运行,那么大pandas会更快。Spark需要启动Session,查找节点,序列化数据等。这就是为什么你有这个开销。继续学习并尝试使用100GB或更高的文件来查看性能。

    2019-07-17 23:23:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载