【问题标题】:Convert StringType Column To ArrayType In PySpark在 PySpark 中将 StringType 列转换为 ArrayType
【发布时间】:2019-12-27 10:15:02
【问题描述】:

我有一个数据类型为字符串的列“EVENT_ID”的数据框。 我正在运行 FPGrowth 算法但抛出以下错误

Py4JJavaError: An error occurred while calling o1711.fit. 
:java.lang.IllegalArgumentException: requirement failed: 
The input column must be array, but got string.

EVENT_ID 列有值

E_34503_Probe
E_35203_In
E_31901_Cbc

我正在使用下面的代码将字符串列转换为数组类型

df2 = df.withColumn("EVENT_ID", df["EVENT_ID"].cast(types.ArrayType(types.StringType())))

但我收到以下错误

Py4JJavaError: An error occurred while calling o1874.withColumn.
: org.apache.spark.sql.AnalysisException: cannot resolve '`EVENT_ID`' due to data type mismatch: cannot cast string to array<string>;;

如何将此列转换为数组类型或使用字符串类型运行 FPGrowth 算法?

【问题讨论】:

  • 只使用pyspark.sql.functions.array:例如:df2 = df.withColumn("EVENT_ID", array(df["EVENT_ID"]))

标签: python python-3.x pyspark pattern-matching fpgrowth


【解决方案1】:

原答案

试试下面的。

In  [0]: from pyspark.sql.types import StringType
         from pyspark.sql.functions import col, regexp_replace, split

In  [1]: df = spark.createDataFrame(["E_34503_Probe", "E_35203_In", "E_31901_Cbc"], StringType()).toDF("EVENT_ID")
         df.show()
Out [1]: +-------------+
         |     EVENT_ID|
         +-------------+
         |E_34503_Probe|
         |   E_35203_In|
         |  E_31901_Cbc|
         +-------------+

In  [2]: df_new = df.withColumn("EVENT_ID", split(regexp_replace(col("EVENT_ID"), r"(^\[)|(\]$)|(')", ""), ", "))
         df_new.printSchema()
Out [2]: root
          |-- EVENT_ID: array (nullable = true)
          |    |-- element: string (containsNull = true)

希望对你有所帮助。

编辑答案

正如@pault 在他的comment 中指出的那样,以下是更简单的解决方案:

In  [0]: from pyspark.sql.types import StringType
         from pyspark.sql.functions import array

In  [1]: df = spark.createDataFrame(["E_34503_Probe", "E_35203_In", "E_31901_Cbc"], StringType()).toDF("EVENT_ID")
         df.show()
Out [1]: +-------------+
         |     EVENT_ID|
         +-------------+
         |E_34503_Probe|
         |   E_35203_In|
         |  E_31901_Cbc|
         +-------------+

In  [2]: df_new = df.withColumn("EVENT_ID", array(df["EVENT_ID"]))
         df_new.printSchema()
Out [2]: root
           |-- EVENT_ID: array (nullable = false)
           |    |-- element: string (containsNull = true)

【讨论】:

  • 这太过分了。你可以使用pyspark.sql.functions.array
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多