检查 parquet scala spark 上是否存在嵌套数据?
Check whether nested data exist on parquet scala spark or not?
所以,我有一个镶木地板文件,其中包含这样的嵌套数据。我想使用 spark 在 scala 中处理:
[
{
"sheep": {
"id": 1,
"data": {
"age": 1,
"price": 101
}
}
},
{
"sheep": {
"id": 2,
"data": {
"age":2
}
}
},
{
"sheep": {
"id": 3,
}
}
]
我试过selectDataFrame中的数据,然后转换成.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 |
--------------------
我使用 isNaN
和 isNull
结合 when
就像 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")
)
}
我也看到了这个解决方案 ,但我找不到如何使用它。首先,由于我将 $"sheep.data.price"
与 $
一起使用,我该如何传递给 hasColumn
函数?我如何引用 hasColumn
函数的 df
参数?我应该通过 sheepDF
吗?
然后,当我尝试将 when
与 hasColumn
结合使用时
我收到此错误:
type mismatch;
found : Boolean
required: org.apache.spark.sql.Column
我也试着在找不到数据的时候读一下这个$"sheep.data.price"
returns。我尝试这样打印它:
(lit($"sheep.data.price".getClass.toString())).as("coupon"),
但是,它 returns class org.apache.spark.sql.ColumnName
我知道应该有一个没有 Try
的更简单的解决方案。谢谢!
使用col("column").
df.select(
col("sheep.id").as("id"),
col("sheep.data.age").as("age"),
when(col("sheep.data.price").isNull, 0).otherwise(col("sheep.data.price")).as("price")).show
结果是:
+---+----+-----+
| id| age|price|
+---+----+-----+
| 1| 1| 101|
| 2| 2| 0|
| 3|null| 0|
+---+----+-----+
所以,我有一个镶木地板文件,其中包含这样的嵌套数据。我想使用 spark 在 scala 中处理:
[
{
"sheep": {
"id": 1,
"data": {
"age": 1,
"price": 101
}
}
},
{
"sheep": {
"id": 2,
"data": {
"age":2
}
}
},
{
"sheep": {
"id": 3,
}
}
]
我试过selectDataFrame中的数据,然后转换成.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 |
--------------------
我使用 isNaN
和 isNull
结合 when
就像 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")
)
}
我也看到了这个解决方案 $"sheep.data.price"
与 $
一起使用,我该如何传递给 hasColumn
函数?我如何引用 hasColumn
函数的 df
参数?我应该通过 sheepDF
吗?
然后,当我尝试将 when
与 hasColumn
结合使用时
我收到此错误:
type mismatch;
found : Boolean
required: org.apache.spark.sql.Column
我也试着在找不到数据的时候读一下这个$"sheep.data.price"
returns。我尝试这样打印它:
(lit($"sheep.data.price".getClass.toString())).as("coupon"),
但是,它 returns class org.apache.spark.sql.ColumnName
我知道应该有一个没有 Try
的更简单的解决方案。谢谢!
使用col("column").
df.select(
col("sheep.id").as("id"),
col("sheep.data.age").as("age"),
when(col("sheep.data.price").isNull, 0).otherwise(col("sheep.data.price")).as("price")).show
结果是:
+---+----+-----+
| id| age|price|
+---+----+-----+
| 1| 1| 101|
| 2| 2| 0|
| 3|null| 0|
+---+----+-----+