【问题标题】:What is the advantage of using $"col" over "col" in spark data frames [duplicate]在 spark 数据帧中使用 $"col" 而不是 "c​​ol" 有什么优势 [重复]
【发布时间】:2019-10-11 20:00:44
【问题描述】:

假设我创建了一个 DF,如下所示

  val posts = spark.read
    .option("rowTag","row")
    .option("attributePrefix","")
    .schema(Schemas.postSchema)
    .xml("src/main/resources/Posts.xml")

使用posts.select("Id")posts.select($"Id") 将其转换为列有什么好处

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    df.select 直接对列进行操作,而$"col" 创建一个 Column 实例。您还可以使用 col 函数创建 Column 实例。现在可以组合列以形成复杂的表达式,然后可以将其传递给任何 df 函数。

    您还可以在 Column 类的 Scaladoc 中找到示例和更多用法。

    参考 - https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.Column

    【讨论】:

      【解决方案2】:

      没有特别的优势,反正是自动转换。但并非 SparkSQL 中的所有方法都执行此转换,因此有时您必须将 Column 对象与 $ 放在一起。

      【讨论】:

      • 将它们转换为列类型有什么好处吗?或者在哪些情况下我们应该转换它们?
      • 就像我说的,当API同时接受列对象和列名时,例如select(),没有优势。当 API 不接受列名时,需要使用列对象来避免编译错误。
      • 是否有任何经验法则可以知道何时需要列类?我无法跟踪何时需要使用它,何时不需要。
      【解决方案3】:

      没有太大区别,但某些功能只能使用带有列名的$

      示例:当我们要对该列中的值进行排序时,如果在列名之前不使用$,它将不起作用。

      Window.orderBy("Id".desc)

      但如果你在列名前使用$,它会起作用。

      Window.orderBy($"Id".desc)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2013-09-13
        • 2023-04-09
        相关资源
        最近更新 更多