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

Python 如何为Spark 2.0群集预处理csv数据?,python,csv,apache-spark,pyspark,Python,Csv,Apache Spark,Pyspark,我有一个非常简单的csv文件,如下所示: time,is_boy,is_girl 135,1,0 136,0,1 137,0,1 我还有一个csv文件放在一个配置单元表中,其中所有的值都被创建为表中的双倍值 在幕后,这个表实际上是巨大的,并且有大量的行,所以我选择使用Spark 2来解决这个问题 我想在Python中使用这个集群库: 如果有人知道如何直接从csv或使用Spark SQL magic加载这些数据,并使用Python对其进行正确的预处理,以便将其传递到kmeans fit()方法

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

time,is_boy,is_girl
135,1,0
136,0,1
137,0,1
我还有一个csv文件放在一个配置单元表中,其中所有的值都被创建为表中的双倍值

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

我想在Python中使用这个集群库:


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

fit方法只需要一个向量/数据帧

spark.read().csv
spark.sql
都会返回数据帧


然而,如果您想预处理数据,请在进入MlLib/Kmeans示例之前阅读Dataframe文档

,因此我猜了足够多的时间并最终解决了这个问题,为了让它正常工作,我必须做很多奇怪的事情,因此我觉得值得分享:

我创建了一个简单的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
然后,我创建了一个配置单元表,以色调执行此查询:

    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脚本如下所示: (我假设已创建名为“spark”的SparkSession)


剩下的就是历史了。我在这里没有做过最佳实践。我们可以从vdf数据框中删除一些不需要的列,以节省空间并提高性能,但这是可行的。

Spark有一个内置的CSV阅读器,SparkSQL可以与Hive交互(不是魔术,它有很好的文档记录)。请说明你已经尝试了什么?你仍然可以将你的问题包括在你尝试过的内容中,并展示你所做的研究,因为,如前所述,这对于你的数据集来说并不清楚,假设性别是一个二元特征安全吗?如果是这样,您只需要
is_boy={0,1}
。换言之,你什么时候会有
is_boy=0
is_girl=0
?谢谢你的回答
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)