【发布时间】:2019-12-17 05:29:45
【问题描述】:
所以,我有一个镶木地板文件,其中包含这样的嵌套数据。我想在 scala 中使用 spark 处理:
[
{
"sheep": {
"id": 1,
"data": {
"age": 1,
"price": 101
}
}
},
{
"sheep": {
"id": 2,
"data": {
"age":2
}
}
},
{
"sheep": {
"id": 3,
}
}
]
我尝试选择DataFrame中的数据,然后将其转换为.csv文件
def get: DataFrame = {
sheepDF
.select(
$"sheep.id".as("id"),
$"sheep.data.age".as("age"),
$"sheep.data.price".as("price")
)
}
然后,它会生成一个像这样的文件:
--------------------
| id | age | price |
--------------------
| 1 | 1 | 123 |
| 2 | 2 | |
| 3 | | |
--------------------
我想要这样的输出文件:
--------------------
| id | age | price |
--------------------
| 1 | 1 | 123 |
| 2 | 2 | 0 |
| 3 | | 0 |
--------------------
我将when 与isNaN 和isNull 结合使用,如this 文章解释。
def get: DataFrame = {
val priceCol = $"sheep.data.price"
sheepDF
.select(
$"sheep.id".as("id"),
$"sheep.data.age".as("age"),
when(priceCol.isNaN, 0).otherwise(priceCol).as("price")
)
}
我也看到了这个解决方案here,但我找不到如何使用它。首先,由于我使用$"sheep.data.price" 和$,我怎样才能传递给hasColumn 函数?我如何引用hasColumn 函数上的df 参数?我应该通过sheepDF吗?
然后,当我尝试将 when 与 hasColumn 结合使用时
我收到了这个错误:
type mismatch;
found : Boolean
required: org.apache.spark.sql.Column
当没有找到数据时,我还尝试读取 $"sheep.data.price" 返回的内容。我尝试这样打印:
(lit($"sheep.data.price".getClass.toString())).as("coupon"),
但是,它返回class org.apache.spark.sql.ColumnName
我知道没有Try 应该有一个更简单的解决方案。谢谢!
【问题讨论】:
标签: scala dataframe apache-spark parquet