我在spark中有一个具有以下模式的Dataframe:模式:
StructType(List(StructField(id,StringType,true),
StructField(daily_id,StringType,true),
StructField(activity,StringType,true)))
列活动是字符串,示例内容:
{1.33,0.567,1.897,0,0.78}
我需要将列活动强制转换为arraytype(doubletype)
为了做到这一点,我运行了以下命令:
df = df.withColumn("activity",split(col("activity"),",\s*").cast(ArrayType(DoubleType())))
Dataframe的新架构相应更改:
StructType(List(StructField(id,StringType,true),
StructField(daily_id,StringType,true),
StructField(activity,ArrayType(DoubleType,true),true)))
但是,现在的数据如下所示:[null,0.567,1.897,0,null]
它将字符串数组的第一个和最后一个元素更改为null。我不明白spark为什么要用Dataframe做这个。
请问有什么问题?
非常感谢
4条答案
按热度按时间nwsw7zdq1#
因为
以下代码不替换
{
&}
```df.withColumn("activity",F.split(F.col("activity"),",\s*")).show(truncate=False)
+-------------------------------+
|activity |
+-------------------------------+
|[{1.33, 0.567, 1.897, 0, 0.78}]|
+-------------------------------+
df.withColumn("activity",F.split(F.col("activity"),",\s*").cast(ArrayType(DoubleType()))).show(truncate=False)
+----------------------+
|activity |
+----------------------+
|[, 0.567, 1.897, 0.0,]|
+----------------------+
df.withColumn("activity",split(col("activity"),",\s*").cast(ArrayType(DoubleType())))
from pyspark.sql import functions as F
from pyspark.sql.types import ArrayType
from pyspark.sql.types import DoubleType
df.select(F.split(F.regexp_replace(F.col("activity"),"[{ }]",""),",").cast("array").alias("activity"))
0g0grzrc2#
试试这个-
gfttwv5a3#
使用spark sql的简单方法(没有regex):
2cmtqfgy4#
这是因为你的第一个和最后一个字母是括号本身,因此将其转换为null