寻找具有原始数据作为输入的Streaming Spark ML示例

时间:2016-11-30 16:33:35

标签: apache-spark machine-learning spark-streaming k-means apache-spark-mllib

我是Spark ML的新手。 我正在寻找以原始数据作为输入的Streaming ml示例(我的意思是原始字符串分隔数据,而不是矢量化数据)。 我试着查看大多数论坛,找到类似的例子,我找不到任何。

所以,我在Spark 1.6上采用以下方式进行Streaming Kmeans(Streaming Kmeans仍适用于矢量数据而不是数据帧), 但我不确定,如果这是正确的方法。

  • 从Kafka输入Dstream记录,我将其转换为Dataframe。
  • 构建一个预数据管道来读取我需要将其转换为向量的列。
  • 由于在每个Stream批处理中,数据都不同,Vector长度可能不同,因此,我使用Tokenizer和HashingTF来维持恒定的向量长度。
  • 同样在每个Stream批处理中,为了识别向量属于哪一行,我已经分配了行号并将其发送到Streaming Kmeans算法
  • 在获取每一行的集群ID后,我将集群ID加入行数据以获取最终的预测数据帧。

现在我对我实施此方法的方式存有疑虑。

  • 据我所知,使用具有固定向量长度的HashingTF(setNumFeatures)将无法解决我的问题,如果向量的组合小于单个批次中的行数,则相同向量的原因可能会再次重复(在我的下面的代码中将其硬编码为200)
  • 我还尝试用OneHotEncoder生成StringIndexer来生成向量,但我看到每个批次的向量长度不同。
  • 由于我们有一个头部为StreamingKMeans分配RandomCenters,我必须知道执行前的矢量长度(对于我的测试数据和列,因为我的矢量长度为800,我现在硬编码它用于测试)
  • 虽然我们必须分别发送带有所有数据组合的训练向量来训练模型,但现在我同时使用训练和测试向量。

有人可以指导我或分享一些以原始数据作为输入的流媒体ml示例吗?

 Const string DB_CONN_STR = "SERVER=127.0.0.1; DATABASE=test7100; UID=root; PASSWORD=";

        MySqlConnection cn = new MySqlConnection(DB_CONN_STR);
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();

        string sqlCmd = "SELECT  `PR4`, `DHT`, `DHR` FROM `table 4` WHERE 1";
            // PR4= place et DHT= time
            MySqlDataAdapter adr = new MySqlDataAdapter(sqlCmd, cn);
            adr.SelectCommand.CommandType = CommandType.Text;
            adr.Fill(dt);



        string[] x = new string[dt.Rows.Count];
        string[] y = new string[dt.Rows.Count];
        string[] z= new string[dt.Rows.Count]


        for (int i = 0; i < dt.Rows.Count; i++)
        {
            y[i] = dt.Rows[i][0].ToString(); // place
            x[i] = dt.Rows[i][1].ToString(); //  theoretical hour format : "hh:mm:ss"
            z[i] = dt.Rows[i][1].ToString(); //  real hour format : "hh:mm:ss" 

        }
int j= dt.rows.count //j=33
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            grapheSillon.Series["théorique"].Points.AddXY(x[i], j);
            grapheSillon.Series["réel"].Points.AddXY(z[i], j);
            j=j-1
        }

0 个答案:

没有答案