我有一个非常简单的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和这个库的例子。
答案 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中删除一些我们不需要的列来节省空间并提高性能,但这样可行。