有什么方法可以优化使用熊猫读取TSV文件,进行转换并使用Spark写入表的代码?

时间:2018-12-15 06:11:34

标签: python pandas apache-spark databricks azure-databricks

    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中的数据创建一个永久表。这就是为什么必须转换为spark数据帧的原因。我还必须将创建的时间戳添加到表中并指定Timestamp数据类型。我不希望将其视为字符串。

然后我需要从表中创建一个熊猫数据框,以便可以对数据进行一些简单的转换。大熊猫数据框应从现有表中制作。

现在,这段代码需要2.48分钟才能在数据块中运行。当我不使用代码创建新的timestamp列并指定其数据类型时,它通常会在6秒内完成。

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

有什么方法可以优化此代码?

1 个答案:

答案 0 :(得分:0)

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

转换-表示创建一个或多个其他RDD的惰性操作。这意味着实际上没有按计划执行任何操作。 Reference

动作-产生与您的toPandas()类似的非RDD结果,这实际上将执行所有转换规划。 Reference

关于执行时间,Spark在开始执行任何任务方面确实有巨大的开销。但是,当与更大的任务相关时,它会获得更好的性能。在很多情况下,火花会比熊猫或麻木慢。但是,当您遇到海量数据的特定情况时,Spark的执行将比任何本地执行都要快。如果您在单机上运行像您这样的小型数据集,则熊猫会更快。 Spark需要启动一个Session,查找节点,序列化数据等等。这就是为什么您有这样的开销。继续学习并尝试使用100GB或更大的文件,以查看性能。