pyspark可行的行为

时间:2018-02-20 05:05:34

标签: apache-spark pyspark pyspark-sql

我想要实现一项功能,我将拥有一些BASE数据,我将获得增量数据。

我将两者合并并执行一些操作(SQL查询),成功后我将为下次运行提供BASE = BASE + incremental。

on exception我的baseData将是BASE_Data(增量不应该是这里的一部分)。

我试过通过下面的代码解释。

我对火花临时表的行为感到困惑......

# i am reading 2 files and persisting them in MEMORY_ONLY
df = spark.read.csv('BASE_data.csv', header=True)
df.persist()
print(df.count())  #o/p:4
df1 = spark.read.csv('data.csv', header=True)
df1.persist()
print(df1.count())  #o/p:4

# i will register temp tables
df.registerTempTable('BASE_data')
spark.sql('select count(1) from BASE_data').show()  # 4 which is fine
# i will append rows from df1 to df(BASE_data) and registered as combined_data
spark.sql("select * from {0}".format('BASE_data')).union(df1).registerTempTable('combined_data')
spark.sql('select count(1) from combined_data').show()  # 8 which is fine too

# Now i am going to unpersist df1 from memory and also change the variable
df1.unpersist()
df1=[]
spark.sql('select count(1) from combined_data').show()
# o/p=8, i am confused here, it should be 4
# when i unpersisted, spark might try to rebuild df1, by reading that file,
# so to be double sure, i reassign df1 to some empty list.

我需要帮助来理解这种行为以及如何实现此功能。

如果有任何其他方法,我正计划采用以下简单方法

- 我不想保留BASE_data和Combine_DATA状态,我可以通过一个temp_table定义来实现。 spark.sql(“select * from {0}”。format('BASE_data'))。union(df1).registerTempTable('BASE_data')

- 我不想创建一些在某个时间之后将被闲置的东西,并且执行将消耗内存。异常的BASE_data应该回退到原始的BASE_data i:应该在异常时通过BASE_data删除新的附加数据(df1),或者取消该异常。

如果有任何事情不清楚,请告诉我,我会尽力解释,谢谢。

try:
    # create combine_data by union
    # do sql ops
    # BASE_DATA  = select * from cobine_data
except Exception:
    # BASE_data = BASE_Data # Basically do nothing

还帮助我“在异常中可以做什么样的清理 - 阻止我可能在Try-block中创建的任何垃圾”。我真的很关心内存管理。感谢。

1 个答案:

答案 0 :(得分:1)

你将df1与df联合(在名为' BASE_data'的临时表中注册),然后用名为combined_data的数据创建一个表。方法registerTempTable()是一个动作,所以当时评估DAG(有向非循环图)(使用df和temp_table' BASE_data'的当前值),因此数据被复制到内存中的不同位置现在独立于df1和df。此时删除df1 对combined_data中的值没有影响,因为它们已经过评估。

我不明白你为什么在第二次计数时得到4而不是8这是正确的。该表是在您进行并集的行上创建的,并且不会从该时间更改,因此结果不会更改。