Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark—在读写表时保持分区_Apache Spark_Pyspark_Databricks_Azure Databricks - Fatal编程技术网

Apache spark Spark—在读写表时保持分区

Apache spark Spark—在读写表时保持分区,apache-spark,pyspark,databricks,azure-databricks,Apache Spark,Pyspark,Databricks,Azure Databricks,我使用Spark(尤其是pyspark)并有以下场景: 有两张桌子(A和B) A由c列和d列分隔 我想从A中读取所有数据,进行微小的转换(例如添加一个静态列),然后将结果保存到B B的分区应该与A完全相同 需要避免洗牌,因为我们有30亿行 因此,从逻辑的角度来看,在没有任何混乱的情况下实现这一点应该非常容易 但是怎么做呢 第1版 df = spark.read.parquet("pathToA") df = df.withColumn("x", f.l

我使用Spark(尤其是pyspark)并有以下场景:

  • 有两张桌子(A和B)
  • A由c列和d列分隔
  • 我想从A中读取所有数据,进行微小的转换(例如添加一个静态列),然后将结果保存到B
  • B的分区应该与A完全相同
  • 需要避免洗牌,因为我们有30亿行
因此,从逻辑的角度来看,在没有任何混乱的情况下实现这一点应该非常容易

但是怎么做呢

第1版

df = spark.read.parquet("pathToA")
df = df.withColumn("x", f.lit("x"))
df.write.format("parquet").save("pathToB")
在这种情况下,表B根本没有分区

第2版

df = spark.read.parquet("pathToA")
df = df.withColumn("x", f.lit("x"))
df.write.format("parquet").partitionBy("c", "d").save("pathToB")
在这种情况下,会有大量的洗牌,这需要永远

第3版

df = spark.read.parquet("pathToA")
df = df.withColumn("x", f.lit("x"))
df = df.repartition("c", "d")
df.write.format("parquet").partitionBy("c", "d").save("pathToB")
与版本2相同->大量洗牌,永远不会结束

如果有人知道如何在不乱序的情况下归档此文件,那将非常有用!提前多谢

致以最良好的祝愿,
本杰明

事实上,第二版是正确的方式:

df = spark.read.parquet("pathToA")
df = df.withColumn("x", f.lit("x"))
df.write.format("parquet").partitionBy("c", "d").save("pathToB")
你可以做的是,如果版本1根本不乱序,你可以读入c,d的每一个排列,它本身就存在,这和版本1是一样的。但我怀疑这会更快:

permutations = [(c,d) for (c,d) in df.dropDuplicates(['c','d']).collect()]

for (c, d) in permutations:
  df = spark.read.parquet("pathToA").filter(f'c = "{c}" AND d = "{d}"')
  df = df.withColumn("x", f.lit("x"))
  df.write.format("parquet").save(f'pathToB/c={c}/d={d}')
这是一种变通方法,我认为如果您在该文件夹顶部有一个配置单元表,则需要使用
msck repair table
刷新它