如何在 pyspark F.create_map 中使用混合数据类型值
How to have mixed datatypes values inside pyspark F.create_map
我正在使用 pyspark 的 create_map
函数来创建 key:value
对列表。我的问题是当我引入带字符串值的键值对时,带浮点值的键值对都被转换为字符串!
有谁知道如何避免这种情况发生?
重现我的问题:
import pandas as pd
import pyspark.sql.functions as F
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local").appName("test").getOrCreate()
test_df = spark.createDataFrame(
pd.DataFrame(
{
"key": ["a", "a", "a"],
"name": ["sam", "sam", "sam"],
"cola": [10.1, 10.2, 10.3],
"colb": [10.2, 12.1, 12.1],
}
)
)
test_df.withColumn("test", F.create_map(
F.lit("a"), F.col("cola").cast("float"),
F.lit("b"), F.col("colb").cast("float"),
F.lit("key"), F.lit("default"),
F.lit("name"), F.lit("ext"),
)).show()
如果您在创建的映射内部进行观察...cola
和 colb
的值是字符串,而不是浮点数!
不,你不能。 MapType
值必须具有相同的类型。这同样适用于键。
MapType(keyType, valueType, valueContainsNull)
: Represents values
comprising a set of key-value pairs. The data type of keys is
described by keyType
and the data type of values is described by
valueType
您可以使用 StructType
代替:
test_df.withColumn(
"test",
F.struct(
F.col("cola").cast("float").alias("a"),
F.col("colb").cast("float").alias("b"),
F.lit("default").alias("key"),
F.lit("ext").alias("name"),
)
).printSchema()
#root
#|-- key: string (nullable = true)
#|-- name: string (nullable = true)
#|-- cola: double (nullable = true)
#|-- colb: double (nullable = true)
#|-- test: struct (nullable = false)
#| |-- a: float (nullable = true)
#| |-- b: float (nullable = true)
#| |-- key: string (nullable = false)
#| |-- name: string (nullable = false)
我正在使用 pyspark 的 create_map
函数来创建 key:value
对列表。我的问题是当我引入带字符串值的键值对时,带浮点值的键值对都被转换为字符串!
有谁知道如何避免这种情况发生?
重现我的问题:
import pandas as pd
import pyspark.sql.functions as F
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local").appName("test").getOrCreate()
test_df = spark.createDataFrame(
pd.DataFrame(
{
"key": ["a", "a", "a"],
"name": ["sam", "sam", "sam"],
"cola": [10.1, 10.2, 10.3],
"colb": [10.2, 12.1, 12.1],
}
)
)
test_df.withColumn("test", F.create_map(
F.lit("a"), F.col("cola").cast("float"),
F.lit("b"), F.col("colb").cast("float"),
F.lit("key"), F.lit("default"),
F.lit("name"), F.lit("ext"),
)).show()
如果您在创建的映射内部进行观察...cola
和 colb
的值是字符串,而不是浮点数!
不,你不能。 MapType
值必须具有相同的类型。这同样适用于键。
MapType(keyType, valueType, valueContainsNull)
: Represents values comprising a set of key-value pairs. The data type of keys is described bykeyType
and the data type of values is described byvalueType
您可以使用 StructType
代替:
test_df.withColumn(
"test",
F.struct(
F.col("cola").cast("float").alias("a"),
F.col("colb").cast("float").alias("b"),
F.lit("default").alias("key"),
F.lit("ext").alias("name"),
)
).printSchema()
#root
#|-- key: string (nullable = true)
#|-- name: string (nullable = true)
#|-- cola: double (nullable = true)
#|-- colb: double (nullable = true)
#|-- test: struct (nullable = false)
#| |-- a: float (nullable = true)
#| |-- b: float (nullable = true)
#| |-- key: string (nullable = false)
#| |-- name: string (nullable = false)