2017-04-20 82 views
3

基本上,我願做一個簡單的刪除使用SQL語句,但是當我執行sql腳本,它拋出我下面的錯誤:如何刪除從Spark數據框創建的表中的行?

pyspark.sql.utils.ParseException: u"\nmissing 'FROM' at 'a'(line 2, pos 23)\n\n== SQL ==\n\n DELETE a.* FROM adsquare a \n-----------------------^^^\n"

這是我使用的腳本:

sq = SparkSession.builder.config('spark.rpc.message.maxSize','1536').config("spark.sql.shuffle.partitions",str(shuffle_value)).getOrCreate() 
adsquare = sq.read.csv(f, schema=adsquareSchemaDevice , sep=";", header=True) 
adsquare_grid = adsqaureJoined.select("userid", "latitude", "longitude").repartition(1000).cache() 
adsquare_grid.createOrReplaceTempView("adsquare") 

sql = """ 
    DELETE a.* FROM adsquare a 
    INNER JOIN codepoint c ON a.grid_id = c.grid_explode 
    WHERE dis2 > 1 """ 

sq.sql(sql) 

注意:代碼點表是在執行過程中創建的。

是否有任何其他方式可以刪除具有上述條件的行?

+2

在Spark中,所有的數據抽象都是不可變的。你必須讓你的UDF填充Ur新數據DF,它排除了你不感興趣的領域。 – BDR

+0

這個簡單的任務對於UDF來說太昂貴了 –

回答

3

您無法從數據框中刪除行。但是您可以創建新的數據框,以排除不需要的記錄。

sql = """ 
    Select a.* FROM adsquare a 
    INNER JOIN codepoint c ON a.grid_id = c.grid_explode 
    WHERE dis2 <= 1 """ 

sq.sql(sql) 

以這種方式,您可以創建新的數據框。這裏我使用了反向條件dis2 <= 1

0

由於Hadoop遵循WORM(多次寫入多次讀取)而不能刪除數據幀中的行,您可以過濾出SQL語句中已刪除的記錄將給您新的數據幀。

2

Apache Spark中的數據框是不可變的。所以你不能改變它,要從數據框中刪除行,你可以過濾不需要的行並保存在另一個數據框中。

相關問題