【问题标题】:In pyspark how to define the schema for list of list with datatype在 pyspark 中,如何定义具有数据类型的列表列表的架构
【发布时间】:2019-11-26 15:27:47
【问题描述】:

我希望 col4 和 col5 应该以 ArrayType 的形式出现,它们以 StringType 的形式出现。它在 pyspark 中。 我想知道我们如何做到这一点。

col4 --array (nullable = true)
      |-- element: IntegerType() (containsNull = true)
col5:--array (nullable = true)
      |-- element: string (containsNull = true)

+---+-----------+
| id|      value|
+---+-----------+
|  1| [foo, foo]|
|  2|[bar, tooo]|
+---+-----------+

+---+-----------+---------------------+
|id |value      |TF_CUS(value)        |
+---+-----------+---------------------+
|1  |[foo, foo] |[[foo], [2]]         |
|2  |[bar, tooo]|[[bar, tooo], [1, 1]]|
+---+-----------+---------------------+

+---+-----------+---------------------+------+-----------+
|id |value      |TF_CUS               |col4  |col5       |
+---+-----------+---------------------+------+-----------+
|1  |[foo, foo] |[[foo], [2]]         |[2]   |[foo]      |
|2  |[bar, tooo]|[[bar, tooo], [1, 1]]|[1, 1]|[bar, tooo]|
+---+-----------+---------------------+------+-----------+

期待看到解决方案 根 |-- id: long (可为空 = true) |-- 值:数组(可为空=真) | |-- 元素:字符串(包含Null = true) |-- TF_CUS: 数组(可为空=真) | |-- 元素:字符串 (containsNull = true)enter code here |-- col4: 字符串(可为空=真) |-- col5: 字符串 (nullable = true)

from pyspark.sql.types import *
from pyspark.sql.functions import udf
from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType
from pyspark.sql.types import DoubleType
from pyspark.sql.types import ArrayType

def TF_CUS(lista):
    from collections import Counter
    counts = (Counter(lista))
    return (list(counts.keys()), list(counts.values()))

TF_CUS_cols = udf(TF_CUS, ArrayType(StringType()))

df = sc.parallelize([(1, ["foo","foo"] ), (2, ["bar", "tooo"])]).toDF(["id", "value"])
df.show()
df.select("*", TF_CUS_cols(df["value"])).show(2, False)
df = df.select("*", TF_CUS_cols(df["value"]).alias("TF_CUS"))
df.withColumn("col4", df["TF_CUS"].getItem(1)).withColumn("col5", df["TF_CUS"].getItem(0)).show(2, False)
df = df.withColumn("col4", (df["TF_CUS"].getItem(1))).withColumn("col5", df["TF_CUS"].getItem(0))

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql apache-spark-mllib


    【解决方案1】:

    对于 col4 而言,您将不得不使用该列,并且基本上进行简单的强制转换以键入数组 (int)。

    import pyspark.sql.functions as F
    
    df = df.withColumn("col6", Fcol("col4").cast("array<int>"))
    

    【讨论】:

    • import pyspark.sql.functions as F df = df.withColumn("col6", F.col("col4").cast("array")) 当我运行得到错误消息(Spark 2.3.1)Py4JJavaError:调用 o9162.withColumn 时出错。 :org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析“col4”:无法将字符串转换为数组;;
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2022-11-21
    • 2018-11-04
    相关资源
    最近更新 更多