在 spark 和 scala 中,如何将数据框转换或映射到特定列信息?

Posted

技术标签:

【中文标题】在 spark 和 scala 中,如何将数据框转换或映射到特定列信息?【英文标题】:In spark and scala, how to convert or map a dataframe to specific columns info? 【发布时间】:2016-11-18 12:51:52 【问题描述】:

斯卡拉。 火花。 智能理念。

我有一个来自 CSV 文件的数据框(多行、多列)。 我希望它映射到另一个特定的列信息。 我认为 scala 类(不是 case 类,因为列数 > 22)或 map().....

但我不知道如何转换它们。

例子

来自 CSV 文件的数据框。

----------------------
| No  |  price| name |
----------------------
|  1  |  100  |  "A" |
----------------------
|  2  |  200  |  "B" |
----------------------

另一个特定的列信息。

 => product_id, product_name, seller

首先,product_id 映射到“否”。 其次,product_name 映射到“名称”。 第三,sellernull 或“”(空字符串)。

所以,最后,我想要一个包含其他列信息的数据框。

-----------------------------------------
| product_id  |  product_name  | seller |
-----------------------------------------
|      1      |       "A"      |        |
-----------------------------------------
|      2      |       "B"      |        |
-----------------------------------------

【问题讨论】:

【参考方案1】:

如果您已经有一个数据框(例如 old_df):

val new_df=old_df.withColumnRenamed("No","product_id").
                  withColumnRenamed("name","product_name").
                  drop("price").
                  withColumn("seller", ... )

【讨论】:

谢谢。威廉姆。但是,old_table 列数为 130。new_table 列数为 40。重叠列数为 20。在这种情况下,withColumnRenamed() 和 drop() 函数是否有效? 是否有另一种方法来映射 old_table(column count:130) 和 new_table(column count:40)?例如,使用 class 或 map() 函数? 如果它很简单,只是列数让你“害怕”,那么编写一个从旧->新映射生成类似于上述代码的小 Python 脚本怎么样? 【参考方案2】:

假设您的 CSV 文件是“products.csv”,

首先你必须在 spark 中加载它,你可以使用

import org.apache.spark.sql.SQLContext

val sqlContext = new SQLContext(sc)
val df = sqlContext.read
     .format("com.databricks.spark.csv")
     .option("header", "true") // Use first line of all files as header
     .option("inferSchema", "true") // Automatically infer data types
     .load("cars.csv")

加载数据后,您将拥有数据框 df 中的所有列名。正如您提到的,您的列名将是“No”、“Price”、“Name”。

要更改列的名称,您只需使用 dataframe 的 withColumnRenamed api。

val renamedDf = df.withColumnRenamed("No","product_id").
   withColumnRenames("name","product_name")

您的重命名 Df 将具有您指定的列名称。

【讨论】:

以上是关于在 spark 和 scala 中,如何将数据框转换或映射到特定列信息?的主要内容,如果未能解决你的问题,请参考以下文章

spark入门知识讲解和基础数据操作编程(统一用scala编程实例)

如何在 Windows 中使用 Scala 将 Cassandra 与 Spark 连接起来

如何在 Zeppelin/Spark/Scala 中漂亮地打印数据框?

如何使用分隔符 ^|^ 将数据文件加载到 spark scala 中?

如何使用 Spark-Scala 解析 JSON 数据

我如何将平面数据框转换为 spark(scala 或 java)中的嵌套 json