使用spark DataFrame"as"方法

Pri*_*NAI 10 scala dataframe apache-spark apache-spark-sql

我正在看spark.sql.DataFrame文档.

def as(alias: String): DataFrame
    Returns a new DataFrame with an alias set.
    Since
        1.3.0 
Run Code Online (Sandbox Code Playgroud)

这种方法的目的是什么?怎么用?可以有一个例子吗?

我还没有在网上找到任何有关此方法的信息,文档也不存在.我没有设法使用这种方法制作任何类型的别名.

zer*_*323 20

Spark <= 1.5

它或多或少等同于SQL表别名:

SELECT *
FROM table AS alias;
Run Code Online (Sandbox Code Playgroud)

根据PySpark alias文档改编的示例用法:

import org.apache.spark.sql.functions.col
case class Person(name: String, age: Int)

val df = sqlContext.createDataFrame(
    Person("Alice", 2) :: Person("Bob", 5) :: Nil)

val df_as1 = df.as("df1")
val df_as2 = df.as("df2")
val joined_df = df_as1.join(
    df_as2, col("df1.name") === col("df2.name"), "inner")
joined_df.select(
    col("df1.name"), col("df2.name"), col("df2.age")).show
Run Code Online (Sandbox Code Playgroud)

输出:

+-----+-----+---+
| name| name|age|
+-----+-----+---+
|Alice|Alice|  2|
|  Bob|  Bob|  5|
+-----+-----+---+
Run Code Online (Sandbox Code Playgroud)

使用SQL查询同样的事情:

df.registerTempTable("df")
sqlContext.sql("""SELECT df1.name, df2.name, df2.age
                  FROM df AS df1 JOIN df AS df2
                  ON df1.name == df2.name""")
Run Code Online (Sandbox Code Playgroud)

这种方法的目的是什么?

几乎避免模糊的列引用.

Spark 1.6+

还有一个新as[U](implicit arg0: Encoder[U]): Dataset[U]的用于将a转换为DataFrameDataSet定类型的a.例如:

df.as[Person]
Run Code Online (Sandbox Code Playgroud)