我必须使用spark(1.6.2)scala检查hive中是否存在表
如果不是,我必须创建一个空数据帧并将其保存为配置表.
如果存在,则覆盖现有表.
我需要一个返回布尔值的函数,根据该函数我可以采取上述决定(是否创建新表或覆盖现有表)
我想知道这里究竟是什么"覆盖".假设我在表"tb1"中有一个包含以下记录的表(对于表的错误表示感到抱歉)
司机vin制作模型
martin abc ford escape
john abd toyota camry
amy abe chevrolet malibu
carlos abf honda civic
Run Code Online (Sandbox Code Playgroud)
现在我有以下数据帧(mydf)具有相同的列但具有以下行/数据
martin abf toyota corolla
carlos abg nissan versa
Run Code Online (Sandbox Code Playgroud)
在使用覆盖模式将上述数据帧保存到"tb1"之后,数据帧是否会完全删除"tb1"的内容并写入mydf的数据(以上两个记录)?
但是,我希望覆盖模式仅覆盖列"driver"具有相同值的那些行.在这种情况下,"tb1"中有4条记录,mydf只会覆盖2条以上的记录,结果表格如下 -
司机vin制作模型
martin abf toyota corolla
john abd toyota camry
amy abe chevrolet malibu
carlos abg nissan versa
Run Code Online (Sandbox Code Playgroud)
我可以使用覆盖模式实现此功能吗?
mydf.write.mode(SaveMode.Overwrite).saveAsTable("tb1")
Run Code Online (Sandbox Code Playgroud) 我查看了API并找到了以下文档 -
def reduceByKey(partitioner: Partitioner, func: (V, V) ? V): RDD[(K, V)]
Run Code Online (Sandbox Code Playgroud)
它使用关联reduce函数合并每个键的值.在将结果发送到reducer之前,这也将在每个映射器上本地执行合并,类似于MapReduce中的"组合器".
def reduceByKeyLocally(func: (V, V) ? V): Map[K, V]
Run Code Online (Sandbox Code Playgroud)
它使用关联reduce函数合并每个键的值,但会立即将结果作为Map返回到master.在将结果发送到reducer之前,这也将在每个映射器上本地执行合并,类似于MapReduce中的"组合器".
除了reduceByKeyLocally将结果作为地图返回给master之外,我认为两者之间没有太大区别.