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数据框本身中进行转换。而且我不知道直接从表中创建熊猫数据框的任何方法。因此,首先是火花,然后是大熊猫。
有什么方法可以优化此代码?
答案 0 :(得分:0)
Spark中有两个概念需要首先了解:
转换-表示创建一个或多个其他RDD的惰性操作。这意味着实际上没有按计划执行任何操作。 Reference
动作-产生与您的toPandas()
类似的非RDD结果,这实际上将执行所有转换规划。 Reference
关于执行时间,Spark在开始执行任何任务方面确实有巨大的开销。但是,当与更大的任务相关时,它会获得更好的性能。在很多情况下,火花会比熊猫或麻木慢。但是,当您遇到海量数据的特定情况时,Spark的执行将比任何本地执行都要快。如果您在单机上运行像您这样的小型数据集,则熊猫会更快。 Spark需要启动一个Session,查找节点,序列化数据等等。这就是为什么您有这样的开销。继续学习并尝试使用100GB或更大的文件,以查看性能。