【问题标题】:How to preserve types while converting Scala Spark DF -> RDD?如何在转换 Scala Spark DF -> RDD 时保留类型?
【发布时间】:2017-04-27 03:36:06
【问题描述】:

我正在尝试将数据帧转换为 RDD。我的 DataFrame 有类型的列,如下所示:

df.printSchema
root
 |-- _c0: integer (nullable = true)
 |-- num_hits: integer (nullable = true)
 |-- session_name: string (nullable = true)
 |-- user_id: string (nullable = true)

当我使用df.rdd 将其转换为rdd 时,我得到一个类型为Array[org.apache.spark.sql.Row] 的rdd,但是当我使用rdd(0)(0)rdd(0)(1) 等访问每个条目时,我知道它们都具有Any 类型。当我将 DataFrame 转换为 RDD 时,如何保持与 DataFrame 相同的类型?换句话说:如何让我的 rdd 中的列具有 IntIntStringString 类型,以便它们与 Dataframe 匹配?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您可以将您的DataFrame 转换为Dataset[(Int, Int, String, String)],例如

    scala> val df = Seq((1, 2, "a", "b")).toDF("_c0", "num_hits", "session_name", "user_id")
    df: org.apache.spark.sql.DataFrame = [_c0: int, num_hits: int ... 2 more fields]
    
    scala> df.printSchema
    root
     |-- _c0: integer (nullable = false)
     |-- num_hits: integer (nullable = false)
     |-- session_name: string (nullable = true)
     |-- user_id: string (nullable = true)
    
    
    scala> val rdd = df.as[(Int, Int, String, String)].rdd
    rdd: org.apache.spark.rdd.RDD[(Int, Int, String, String)] = MapPartitionsRDD[3] at rdd at <console>:25
    

    如果_c0num_hits 可以是null,只需将Int 更改为java.lang.Integer

    【讨论】:

    • 做到了。谢谢! df.rdd 不选择类型是否有原因?
    • 因为DataFrame不知道你想要什么类型。 as[(Int, Int, String, String)] 基本上只是告诉 Spark 你想将 Row 转换为 (Int, Int, String, String)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多