在 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
映射到“名称”。
第三,seller
是null
或“”(空字符串)。
所以,最后,我想要一个包含其他列信息的数据框。
-----------------------------------------
| 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 中漂亮地打印数据框?