【问题标题】:spark.sql.crossJoin.enabled for Spark 2.xspark.sql.crossJoin.enabled 用于 Spark 2.x
【发布时间】:2016-12-24 06:13:42
【问题描述】:

我正在使用带有 Spark 2.0.0 的“预览版”Google DataProc Image 1.1。要完成我的一项操作,我必须完成一个笛卡尔积。从 2.0.0 版本开始,创建了一个 spark 配置参数 (spark.sql.cross Join.enabled),禁止笛卡尔积并引发异常。如何设置 spark.sql.crossJoin.enabled=true,最好使用初始化操作? spark.sql.crossJoin.enabled=true

【问题讨论】:

    标签: apache-spark google-cloud-dataproc


    【解决方案1】:

    火花 >= 3.0

    spark.sql.crossJoin.enable 默认为 true (SPARK-28621)。

    火花 >= 2.1

    你可以使用crossJoin:

    df1.crossJoin(df2)
    

    它使您的意图明确,并保持更保守的配置,以保护您免受意外的交叉连接。

    Spark 2.0

    SQL 属性可以在运行时使用RuntimeConfig.set 方法动态设置,因此您应该可以调用

    spark.conf.set("spark.sql.crossJoin.enabled", true)
    

    只要您想明确允许笛卡尔积。

    【讨论】:

    • 在 spark 2.1 之前,crossJoin() 似乎在 DataFrame/Dataset 上不可用。
    • @RickHaffey 对于 Spark 2.1 之前的版本,使用 dataset.join(rightDataset) API 和 spark.conf.set("spark.sql.crossJoin.enabled", true) 配置选项。这种风格也适用于 Spark 2.1,但 .crossJoin API 是理想的,因为它更明确。
    • 如果你在 iPython 中工作,true 应该是 True
    【解决方案2】:

    要更改 Dataproc 中配置设置的默认值,您甚至不需要初始化操作,您可以在从命令行创建集群时使用 --properties flag

    gcloud dataproc clusters create --properties spark:spark.sql.crossJoin.enabled=true my-cluster ...
    

    【讨论】:

      【解决方案3】:

      TPCDS 查询集基准有包含 CROSS JOINS 的查询,除非您明确编写 CROSS JOIN 或动态地将 Spark 的默认属性设置为 true Spark.conf.set("spark.sql.crossJoin.enabled", true),否则您将遇到异常错误。

      该错误出现在 TPCDS 查询 28、61、88 和 90 上,因为来自事务处理委员会 (TPC) 的原始查询语法包含逗号,并且 Spark 的默认连接操作是内连接。我的团队还决定使用CROSS JOIN 来代替更改 Spark 的默认属性。

      【讨论】:

        【解决方案4】:

        我觉得应该是

        spark.conf.set("spark.sql.crossJoin.enabled", True)
        

        否则它会给出

        NameError: name 'true' 未定义

        【讨论】:

          猜你喜欢
          • 2018-07-22
          • 1970-01-01
          • 1970-01-01
          • 2018-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多