-1
    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 数据类型。我不希望它被当作字符串。

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

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

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

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

4

1 回答 1

0

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

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

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

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

于 2018-12-17T05:38:00.570 回答