scala - 有没有办法从 Scala 中数据框的现有列创建多个列?
问题描述
我正在尝试将 RDBMS 表摄取到 Hive 中。我通过以下方式获得了数据框:
val yearDF = spark.read.format("jdbc").option("url", connectionUrl)
.option("dbtable", "(select * from schema.tablename where source_system_name='DB2' and period_year='2017') as year2017")
.option("user", devUserName)
.option("password", devPassword)
.option("numPartitions",15)
.load()
这些是数据框的列:
geography:string|
project:string|
reference_code:string
product_line:string
book_type:string
cc_region:string
cc_channel:string
cc_function:string
pl_market:string
ptd_balance:double
qtd_balance:double
ytd_balance:double
xx_last_update_tms:timestamp
xx_last_update_log_id:int
xx_data_hash_code:string
xx_data_hash_id:bigint
这些列ptd_balance, qtd_balance, ytd_balance
是双精度数据类型,它们是精度列。我们的项目希望通过创建新列将其数据类型从 Double 转换为 String:ptd_balance_text, qtd_balance_text, ytd_balance_text
使用相同的数据以避免任何数据截断。
withColumn
将在数据框中创建一个新列。
withColumnRenamed
将重命名现有列。
数据框有近 1000 万条记录。有没有一种有效的方法来创建多个具有相同数据和不同类型的新列与数据框中的现有列?
解决方案
如果我站在你的立场上,我会在提取查询中进行更改或要求 BI 团队付出一些努力:P以便在提取时动态添加和转换字段,但你所要求的任何方式都是可能的。
您可以从现有列中添加列,如下所示。检查addColsTosampleDF
dataframe
. 我希望下面的评论足以理解,如果您有任何问题,请随时在评论中添加,我将编辑我的答案。
scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._
scala> import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
scala> val ss = SparkSession.builder().appName("TEST").getOrCreate()
18/08/07 15:51:42 WARN SparkSession$Builder: Using an existing SparkSession; some configuration may not take effect.
ss: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@6de4071b
//Sample dataframe with int, double and string fields
scala> val sampleDf = Seq((100, 1.0, "row1"),(1,10.12,"col_float")).toDF("col1", "col2", "col3")
sampleDf: org.apache.spark.sql.DataFrame = [col1: int, col2: double ... 1 more field]
scala> sampleDf.printSchema
root
|-- col1: integer (nullable = false)
|-- col2: double (nullable = false)
|-- col3: string (nullable = true)
//Adding columns col1_string from col1 and col2_doubletostring from col2 with casting and alias
scala> val addColsTosampleDF = sampleDf.
select(sampleDf.col("col1"),
sampleDf.col("col2"),
sampleDf.col("col3"),
sampleDf.col("col1").cast("string").alias("col1_string"),
sampleDf.col("col2").cast("string").alias("col2_doubletostring"))
addColsTosampleDF: org.apache.spark.sql.DataFrame = [col1: int, col2: double ... 3 more fields]
//Schema with added columns
scala> addColsTosampleDF.printSchema
root
|-- col1: integer (nullable = false)
|-- col2: double (nullable = false)
|-- col3: string (nullable = true)
|-- col1_string: string (nullable = false)
|-- col2_doubletostring: string (nullable = false)
scala> addColsTosampleDF.show()
+----+-----+---------+-----------+-------------------+
|col1| col2| col3|col1_string|col2_doubletostring|
+----+-----+---------+-----------+-------------------+
| 100| 1.0| row1| 100| 1.0|
| 1|10.12|col_float| 1| 10.12|
+----+-----+---------+-----------+-------------------+
推荐阅读
- event-handling - wxPython 事件未处理?
- reactjs - 在单个组件内定义多个状态变量?
- angular2-nativescript - 如果图像 src 在 nativescript anguar 中无效,如何设置默认图像
- azure - 如何基于路由在 Azure Function 中对租户进行身份验证
- nopcommerce - 如何在 nopcommerce 中实施“反向竞价”(反向拍卖)?(供应商竞标客户发布的特定工作)
- php - 将图像编码为 base64 无法正常工作
- google-oauth - 子子域上的 google oauth2 - 不是有效的来源
- python-3.x - 获取 Outlook 约会后无法调用 win32com.client.Dispatch AppointmentItem 的“大小”属性
- swift - 从导航控制器回到视图控制器?
- java - 关于spring-data中实体之间的映射