【问题标题】:How to read a csv to use in pyspark MLlib?如何读取 csv 以在 pyspark MLlib 中使用?
【发布时间】:2019-12-22 00:46:40
【问题描述】:

我有一个 csv 文件,我试图将其用作 pyspark 中 KMeans 算法的输入。我正在使用 MLlib 文档中的代码。

from pyspark.ml.clustering import KMeans
from pyspark.ml.evaluation import ClusteringEvaluator

# Loads data.
dataset = spark.read.format("libsvm").load("P.txt")

# Trains a k-means model.
kmeans = KMeans().setK(2).setSeed(1)
model = kmeans.fit(dataset)

# Make predictions
predictions = model.transform(dataset)

# Evaluate clustering by computing Silhouette score
evaluator = ClusteringEvaluator()

silhouette = evaluator.evaluate(predictions)
print("Silhouette with squared euclidean distance = " + str(silhouette))

# Shows the result.
centers = model.clusterCenters()
print("Cluster Centers: ")
for center in centers:
    print(center) 

我收到了错误:

java.lang.NumberFormatException: For input string: "-6.71,-1.14"

我尝试将文件读取为

dataset = spark.read.format("csv").load("P.txt")

但我得到另一个错误:

java.lang.IllegalArgumentException: Field "features" does not exist. Available fields: _c0, _c1

我是 pyspark 的初学者,我试图寻找这方面的教程,但没有找到。

【问题讨论】:

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


    【解决方案1】:

    我发现了问题。 kmeans.fit 的 DataFrame 输入需要有一个字段“特征”,正如错误 java.lang.IllegalArgumentException: Field "features" does not exist. Available fields: _c0, _c1 所指示的那样。

    为此,我们需要一个VectorAssembler,但在我们需要将列转换为数字类型之前,我们会收到错误java.lang.IllegalArgumentException: Data type string of column _c0 is not supported。

    from pyspark.sql.functions import col
    
    df = spark.read.csv('P.txt')
    # Convert columns to float
    df = df.select(*(col(c).cast("float").alias(c) for c in df.columns))
    
    assembler = VectorAssembler(
        inputCols=["_c0", "_c1"],
        outputCol="features")
    
    df = assembler.transform(df)
    df = df.drop("_c0")
    df = df.drop("_c1")
    df.show()
    

    【讨论】:

      【解决方案2】:

      勾选此方法读取 CSV 文件:

      df = spark.read.options(header=True).csv('csvFile.csv')
      
      df.show()
      

      【讨论】:

      • 它返回与dataset = spark.read.format("csv").load("P.txt") 相同的df,但我仍然收到错误java.lang.IllegalArgumentException: Field "features" does not exist. Available fields: _c0, _c1
      • 请重新检查答案。已添加 options。 @HenriqueAndrade
      • 我仍然得到同样的错误,即使我在 csv 中添加了一个标题
      • 问题不是你的数据加载,你应该加载你的数据并将你的特征变成学习Mllib的特征列,你可以在下面的链接中看到例子:towardsdatascience.com/…
      【解决方案3】:

      Available fields: _c0, _c1

      检查数据文件的第一行。 headers=True在创建时保存到hdfs时,很有可能没有使用参数。

      【讨论】:

      • 什么意思?我用bin/hdfs dfs -copyFromLocal P.txt /保存到hdfs,这个命令里面有headers=True的选项吗?
      • 在命令行中尝试head P.txt,看看你的源文件是否有任何类型的标题
      • 没什么区别,我试过用header和没有header
      • 但是你的源文件有标题吗?
      猜你喜欢
      • 2020-01-26
      • 2022-01-03
      • 2020-04-30
      • 2021-05-22
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多