如何为Spark 2.0集群预处理csv数据?

时间:2017-12-12 14:07:20

标签: python csv apache-spark pyspark

我有一个非常简单的csv文件,如下所示:

time,is_boy,is_girl
135,1,0
136,0,1
137,0,1

我也将这个csv文件放在一个Hive表中,其中所有的值都是在表中创建为双精度。

在幕后,这个表实际上是巨大的,并且有很多行,所以我选择使用Spark 2来解决这个问题。

我想在Python中使用这个集群库: https://spark.apache.org/docs/2.2.0/ml-clustering.html

如果有人知道如何直接从csv或使用一些Spark SQL魔法加载这些数据,并使用Python正确预处理它,以便可以将其传递给kmeans fit()方法并计算模型, 我会很感激。我也认为这对其他人有用,因为我还没有找到csvs和这个库的例子。

2 个答案:

答案 0 :(得分:0)

fit方法只需要一个vector / Dataframe

>>> soup.find(string='linktext1').parent.attrs['href'] 'http://www.link1.com' spark.read().csv都会返回一个Dataframe。

但是,您想要预处理数据,在进入MlLib / Kmeans示例之前阅读Dataframe文档

答案 1 :(得分:0)

所以我猜到了足够的时间并最终解决了这个问题,为了让它发挥作用,我必须做很多奇怪的事情,所以我觉得值得分享:

我创建了一个简单的csv,如下所示:

time,is_boy,is_girl
123,1.0,0.0
132,1.0,0.0
135,0.0,1.0
139,0.0,1.0
140,1.0,0.0

然后我创建了一个hive表,在hue中执行此查询:

    CREATE EXTERNAL TABLE pollab02.experiment_raw(  
        `time` double,
        `is_boy` double,
        `is_girl` double) 
   ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' with 
   serdeproperties( 'separatorChar' = ',' ) 
   STORED AS TEXTFILE LOCATION "/user/me/hive/experiment" 
   TBLPROPERTIES ("skip.header.line.count"="1", "skip.footer.line.count"="0")

然后我的pyspark脚本如下: (我假设SparkSession已创建名为“spark”)

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.ml.feature import VectorAssembler

raw_data = spark.sql("select * from dbname.experiment_raw")

#filter out row of null values that were added for some reason
raw_data_filtered=raw_data.filter(raw_data.time>-1)

#convert rows of strings to doubles for kmeans:
data=raw_data_filtered.select([col(c).cast("double") for c in raw_data_filtered.columns])
cols = data.columns

#Merge data frame with column called features, that contains all data as a vector in each row
vectorAss = VectorAssembler(inputCols=cols, outputCol="features")
vdf=vectorAss.transform(data)
kmeans = KMeans(k=2, maxIter=10, seed=1)
model = kmeans.fit(vdf)

其余的都是历史。我没有在这里做过最好的最佳做法。我们可能会从vdf DataFrame中删除一些我们不需要的列来节省空间并提高性能,但这样可行。