代码之家  ›  专栏  ›  技术社区  ›  Prasanna Saraswathi Krishnan

PySpark-分区中覆盖的数据

  •  0
  • Prasanna Saraswathi Krishnan  · 技术社区  · 6 年前

    我看到了这样一种情况:当将pyspark数据帧保存到具有多列分区的配置单元表时,它也会覆盖子分区中的数据。或者-可能是我假设它是一个子分区。

    我想将“月”列视为子分区。这样,当我将df2保存到同一个表时,可以看到4条记录(在配置单元表中),而不是2条记录。

    mode=append 将起作用。但是,如果年&月份相同,我希望数据被覆盖。在保存pyspark数据帧时,有没有办法做到这一点?

    >>> df1 = spark.sql('select * from test_input')
    >>> df1.show()
    +---+---+----+-----+
    | f1| f2|year|month|
    +---+---+----+-----+
    |  a|  b|2018|   01|
    |  c|  d|2018|   01|
    +---+---+----+-----+
    
    >>> df1.write.saveAsTable('test_output',mode='overwrite',partitionBy=('year','month'))
    >>> spark.sql('select * from test_output').show()
    +---+---+----+-----+
    | f1| f2|year|month|
    +---+---+----+-----+
    |  a|  b|2018|   01|
    |  c|  d|2018|   01|
    +---+---+----+-----+
    
    >>> df2 = spark.sql('select * from test_input')
    >>> df2.show()
    +---+---+----+-----+
    | f1| f2|year|month|
    +---+---+----+-----+
    |  a|  b|2018|   02|
    |  c|  d|2018|   02|
    +---+---+----+-----+
    
    >>> df2.write.saveAsTable('test_output',mode='overwrite',partitionBy=('year','month'))
    >>> spark.sql('select * from test_output').show()
    +---+---+----+-----+
    | f1| f2|year|month|
    +---+---+----+-----+
    |  a|  b|2018|   02|
    |  c|  d|2018|   02|
    +---+---+----+-----+
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Kirk Broadhurst    6 年前

    似乎您误解了分区的概念。

    这不是SQL语句中会遇到的窗口函数分区;相反,它指的是在内存或文件系统中存储和引用数据的方式。 Here's a helpful introduction.

    更改Spark数据帧的分区将 从不 更改该数据帧中的行数。