有没有办法将新列附加到现有的镶木地板文件?
我正在进行一场讨价还价的竞赛,我已将所有数据转换为镶木地板文件。
在这种情况下,我将镶木地板文件读入pyspark DataFrame,进行了一些特征提取并将新列添加到DataFrame中
pysaprk.DataFrame.withColumn()。
之后,我想在源镶木地板文件中保存新列。
我知道Spark SQL附带subscribe to it,但该示例仅显示了具有键值的情况。
镶木地板“附加”模式也不起作用。它只将新行附加到镶木地板文件中。 如果无论如何都要将新列附加到现有的镶木地板文件而不是再次生成整个表格? 或者我必须生成一个单独的新镶木地板文件并在运行时加入它们。
答案 0 :(得分:2)
虽然这个问题已经发布了2年,但仍然没有答案,让我自己回答我自己的问题。
在我仍然使用Spark的时候,Spark的版本是1.4。我不支持新版本,但对于该版本,不可能在镶木地板文件中添加新列。
答案 1 :(得分:2)
在镶木地板中,您不会修改文件,阅读它们,修改它们并将它们写回来,您不能只更改需要读取和写入完整文件的列。
答案 2 :(得分:0)
是的, Databricks Delta 和 parquet 表都可以。下面是一个示例:-
此示例使用 python (pySpark)
编写df = sqlContext.createDataFrame([('1','Name_1','Address_1'),('2','Name_2','Address_2'),('3','Name_3','Address_3')], schema=['ID', 'Name', 'Address'])
delta_tblNm = 'testDeltaSchema.test_delta_tbl'
parquet_tblNm = 'testParquetSchema.test_parquet_tbl'
delta_write_loc = 'dbfs:///mnt/datalake/stg/delta_tblNm'
parquet_write_loc = 'dbfs:///mnt/datalake/stg/parquet_tblNm'
# DELTA TABLE
df.write.format('delta').mode('overwrite').option('overwriteSchema', 'true').save(delta_write_loc)
spark.sql(" create table if not exists {} using DELTA LOCATION '{}'".format(delta_tblNm, delta_write_loc))
spark.sql("refresh table {}".format(print(cur_tblNm)))
# PARQUET TABLE
df.write.format("parquet").mode("overwrite").save(parquet_write_loc)
spark.sql("""CREATE TABLE if not exists {} USING PARQUET LOCATION '{}'""".format(parquet_tblNm, parquet_write_loc))
spark.sql(""" REFRESH TABLE {} """.format(parquet_tblNm))
test_df = spark.sql("select * testDeltaSchema.test_delta_tbl")
test_df.show()
test_df = spark.sql("select * from testParquetSchema.test_parquet_tbl")
test_df.show()
test_df = spark.sql("ALTER TABLE testDeltaSchema.test_delta_tbl ADD COLUMNS (Mob_number String COMMENT 'newCol' AFTER Address)")
test_df.show()
test_df = spark.sql("ALTER TABLE testParquetSchema.test_parquet_tbl ADD COLUMNS (Mob_number String COMMENT 'newCol' AFTER Address)")
test_df.show()