代码之家  ›  专栏  ›  技术社区  ›  Jerry George

在PySpark中将StringType转换为ArrayType

  •  2
  • Jerry George  · 技术社区  · 7 年前

    我正在尝试在我的数据集上运行PySpark中的FPGrowth算法。

    from pyspark.ml.fpm import FPGrowth
    
    fpGrowth = FPGrowth(itemsCol="name", minSupport=0.5,minConfidence=0.6) 
    model = fpGrowth.fit(df)
    

    我收到以下错误:

    An error occurred while calling o2139.fit.
    : java.lang.IllegalArgumentException: requirement failed: The input 
    column must be ArrayType, but got StringType.
    at scala.Predef$.require(Predef.scala:224)
    

    我的数据帧df的格式为:

    df.show(2)
    
    +---+---------+--------------------+
    | id|     name|               actor|
    +---+---------+--------------------+
    |  0|['ab,df']|                 tom|
    |  1|['rs,ce']|                brad|
    +---+---------+--------------------+
    only showing top 2 rows
    

    如果“name”列中的数据格式为:

     name
    [ab,df]
    [rs,ce]
    

    如何以从StringType转换为ArrayType的形式获取它

    我从RDD形成了数据帧:

    rd2=rd.map(lambda x: (x[1], x[0][0] , [x[0][1]]))
    
    rd3 = rd2.map(lambda p:Row(id=int(p[0]),name=str(p[2]),actor=str(p[1])))
    df = spark.createDataFrame(rd3)
    
    rd2.take(2):
    
    [(0, 'tom', ['ab,df']), (1, 'brad', ['rs,ce'])]
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Oluwafemi Sule    7 年前

    中每行按逗号分隔 name 数据帧的列。 e、 g。

    from pyspark.sql.functions import pandas_udf, PandasUDFType
    
    @pandas_udf('list', PandasUDFType.SCALAR)
    def split_comma(v):
        return v[1:-1].split(',')
    
    df.withColumn('name', split_comma(df.name))
    

    或者更好,不要推迟。将名称直接设置为列表。

    rd2 = rd.map(lambda x: (x[1], x[0][0], x[0][1].split(',')))
    rd3 = rd2.map(lambda p:Row(id=int(p[0]), name=p[2], actor=str(p[1])))
    
        2
  •  1
  •   pault Tanjin    7 年前

    基于 your previous question ,似乎你正在建造 rdd2 不正确。

    尝试以下操作:

    rd2 = rd.map(lambda x: (x[1], x[0][0] , x[0][1].split(",")))
    rd3 = rd2.map(lambda p:Row(id=int(p[0]), name=p[2], actor=str(p[1])))
    

    变化是我们称之为 str.split(",") 在…上 x[0][1] 以便将类似“a,b”的字符串转换为列表: ['a', 'b']