【问题标题】:How to delete rows in a table created from a Spark dataframe?如何删除从 Spark 数据框创建的表中的行?
【发布时间】:2017-04-20 18:36:33
【问题描述】:

基本上,我想使用 SQL 语句进行简单的删除,但是当我执行 sql 脚本时,它会抛出以下错误:

pyspark.sql.utils.ParseException: u"\n在 'a' 处缺少 'FROM'(第 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)

注意:代码点表是在执行过程中创建的。

有没有其他方法可以删除符合上述条件的行?

【问题讨论】:

  • 在 Spark 中,所有的数据抽象都是不可变的。你必须有你的 UDF 来填充你的新数据 DF,它排除了你不感兴趣的字段。
  • UDF 对于这个简单的任务来说太贵了

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

Apache Spark 中的数据帧是不可变的。所以你不能改变它,要从数据框中删除行,你可以过滤你不想要的行并保存在另一个数据框中。

【讨论】:

    【解决方案2】:

    您不能从数据框中删除行。但是您可以创建新的数据框来排除不需要的记录。

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

    通过这种方式,您可以创建新的数据框。这里我使用了反向条件dis2 &lt;= 1

    【讨论】:

      【解决方案3】:

      您不能从数据框中删除行,因为 Hadoop 遵循 WORM(一次写入多次读取),您可以在 SQL 语句中过滤掉已删除的记录,从而为您提供新的数据框。

      【讨论】:

        猜你喜欢
        • 2017-09-12
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        相关资源
        最近更新 更多