2017-04-20 52 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中的数据框是不可变的。所以你不能改变它,要从数据框中删除行,你可以过滤不需要的行并保存在另一个数据框中。

相关问题