Apache spark 令人垂涎三尺的行为

Apache spark 令人垂涎三尺的行为,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我想实现一个功能,我会有一些基础数据,我会得到增量数据 我将两者结合起来并执行一些操作SQL查询,如果成功,我将在下一次运行时使用BASE=BASE+incremental 例外情况下,我的baseData将是BASE_Dataincremental,此处不应包含 我试着通过下面的代码进行解释 我对火花温度表的行为感到困惑 # i am reading 2 files and persisting them in MEMORY_ONLY df = spark.read.csv('BASE_dat

我想实现一个功能,我会有一些基础数据,我会得到增量数据

我将两者结合起来并执行一些操作SQL查询,如果成功,我将在下一次运行时使用BASE=BASE+incremental

例外情况下,我的baseData将是BASE_Dataincremental,此处不应包含

我试着通过下面的代码进行解释

我对火花温度表的行为感到困惑

# 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.
我需要这里的帮助来理解这个行为以及如何实现这个功能

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

-我不想保留基本数据和合并数据状态,我可以通过使用单个临时表定义来实现。spark.sqlselect*来自{0}。格式为'BASE_data'。uniondf1.RegisterEmptable'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块中创建的垃圾进行什么样的清理。我非常关心内存管理。谢谢。

您将df1与在名为“BASE_data”的临时表中注册的df合并,然后使用名为“combined_data”的数据创建一个表。registerTempTable方法是一种操作,因此,此时使用df和temp_表“BASE_data”的当前值对DAG有向无环图进行评估,以便将数据复制到内存中的不同位置,并且现在独立于df1和df。此时删除df1对组合_数据中的值没有影响,因为它们已被评估


我不明白你为什么期望在第二次计数时得到4而不是正确的8。表是在执行并集的行上创建的,从那时起不会更改,因此结果不会更改。

我的错,我当时不确定数据是否复制到内存中的其他位置。但我认为既然spark是懒惰的,为什么在声明中它会进入内存。spark是懒惰的,直到一个动作被触发。注册为表是一个动作,因此在这个时候,所有内容都会在不同的内存位置进行评估和复制。此外,如果答案有帮助,请投票并结束问题。这里还有一个问题,如果内存中发生了诱惑,这是否意味着,如果我有2GB数据,然后在临时表2GB i:e上持续2GB+将消耗4GB RAM内存??如果它在内存中,那么在注册临时表之后,我可以取消数据帧的持久性以释放一些内存,在这里纠正我???在临时表的情况下,容错是如何工作的??这是太多的问题,我问,但我很好奇知道所有这些,如果这是需要时间,请给我一些链接去通过,这将足够了。非常感谢你的帮助。你的基本逻辑是正确的。当您注册一个表时,数据以配置单元的列格式保存,添加到字典中可以显著减少内存消耗,因此即使您的文件是2gB的临时表,它也会更少。在执行这些操作时,您可以随时检查内存,以了解各种策略如何影响内存消耗。两个注意事项:首先,在Spark 2.0中不推荐使用RegisterTempTable,因此如果您在Spark 2.0+中工作,请使用createOrReplaceTempView。第二,你真的需要考虑为什么要坚持DF。这对你有什么好处?