基本上,我想使用SQL语句进行简单的删除,但是当我执行sql脚本时,它会抛出以下错误:
pyspark.sql.utils.ParseException:u" \ nmissing' FROM' at' a'(第2行, pos 23)\ n \ n == SQL == \ n \ n删除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)
注意:代码点表在执行期间创建。
有没有其他方法可以删除具有上述条件的行?
答案 0 :(得分:6)
Apache Spark中的数据帧是不可变的。因此,您无法更改它,要从数据框中删除行,您可以过滤您不想要的行并保存在另一个数据框中。
答案 1 :(得分:6)
您无法从数据框中删除行。但您可以创建新的数据框,以排除不需要的记录。
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
答案 2 :(得分:2)
您无法从数据框中删除行,因为Hadoop遵循 WORM(多次写入一次读取),而您可以过滤掉SQL语句中已删除的记录,从而为您提供新的数据框。 / p>