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。
有没有办法优化这段代码?
spark中有两个概念需要先了解:
转换 - 这意味着创建一个或多个其他RDD的延迟操作。这意味着没有任何实际执行的计划。
动作 - 产生像toPandas()这样的非RDD结果实际上执行所有转换计划。参考
关于执行的时间,Spark开始执行任何任务都有很大的开销。但是当它与更大的任务相关时,它会获得更好的性能。有很多情况下spark会比pandas或numpy慢。但是当你到达一个特定的大数据案例时,Spark的执行速度将比任何本地执行都要快。如果你使用像这样的小型数据集的单台机器运行,那么大pandas会更快。Spark需要启动Session,查找节点,序列化数据等。这就是为什么你有这个开销。继续学习并尝试使用100GB或更高的文件来查看性能。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。