考虑具有以下架构的Spark DataFrame df
:
root
|-- date: timestamp (nullable = true)
|-- customerID: string (nullable = true)
|-- orderID: string (nullable = true)
|-- productID: string (nullable = true)
一列应强制转换为其他类型,其他列应仅修剪其空白。
df.select(
$"date",
df("customerID").cast(IntegerType),
$"orderID",
$"productId")
.withColumn("orderID", trim(col("orderID")))
.withColumn("productID", trim(col("productID")))
这些操作似乎需要不同的语法;投射通过select
完成,而trim
通过withColumn
完成。
我已经习惯了R
和dplyr
,其中所有上述内容都将在单个mutate
函数中处理,因此将select
和withColumn
混合起来会感到有些麻烦
是否有更清洁的方法在单个管道中执行此操作?
答案 0 :(得分:1)
df.select(
$"date",
$"customerID".cast(IntegerType),
trim($"orderID").as("orderID"),
trim($"productID").as("productID"))
答案 1 :(得分:1)
您可以使用任何一个。区别在于withColumn
将向数据框中添加(或使用相同名称,则替换)新列,而select
仅保留您指定的列。根据情况,选择一种使用。
cast
可以使用withColumn
完成,如下所示:
df.withColumn("customerID", $"customerID".cast(IntegerType))
.withColumn("orderID", trim($"orderID"))
.withColumn("productID", trim($"productID"))
请注意,您不需要在上面的withColumn
列上使用date
。
trim
函数可以在select
中完成,如下所示,此处的列名保持不变:
df.select(
$"date",
$"customerID".cast(IntegerType),
trim($"orderID").as("orderID"),
trim($"productId").as("productId"))