有什么方法可以优化这个使用panda读取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中的数据创建一个pernant表。这就是为什么转换为spark数据帧是必要的。我还必须将创建的时间戳添加到表中,并指定timestamp数据类型。我不想把它当作绳子。

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

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

有什么方法可以优化这个代码吗?我不知道是否有任何方法可以直接将pandas数据帧保存为表。因此转换为火花数据帧。我需要在Pandas数据帧本身中进行转换。我不知道有什么方法可以直接从表中创建pandas数据帧。因此,先是火花,然后是熊猫。

有什么方法可以优化这个代码吗?

Spark中有两个概念需要首先理解:

转换-这意味着创建一个或多个其他RDD的惰性操作。这意味着没有任何事情是按计划执行的。参考

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

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