簡體   English   中英

在Spark java中將JavaRDD轉換為DataFrame

[英]Converting JavaRDD to DataFrame in Spark java

我正在嘗試處理LogFile。 首先,我按照我的要求讀取日志文件並拆分這些文件,並將每個列保存到單獨的JavaRDD中。 現在我需要將這些JavaRDD轉換為DataFrames以供將來操作。 這是我到目前為止所嘗試的代碼:

         SparkConf conf = new SparkConf().setAppName("AuctionBid").setMaster("local");
         JavaSparkContext sc = new JavaSparkContext(conf);
         JavaRDD<String> diskfile = sc.textFile("/Users/karuturi/Downloads/log.txt");
         JavaRDD<String> urlrdd=diskfile.flatMap(line -> Arrays.asList(line.split("\t")[0]));
         System.out.println(urlrdd.take(1));
         SQLContext sql = new SQLContext(sc);

這就是我試圖將JavaRDD轉換為DataFrame的方式:

DataFrame fileDF = sqlContext.createDataFrame(urlRDD, Model.class);

但上面的行不起作用。我對Model.class感到困惑。

任何人都可以建議我。

謝謝。

進口:

import java.io.Serializable;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;

為URL創建POJO類。 我建議你寫日志行,其中包括url,date,time,method,target,.. etc作為成員

public static class Url implements Serializable {
  private String value;

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }
}  

從文本文件創建Url對象的RDD

JavaRDD<Url> urlsRDD = spark.read()
  .textFile("/Users/karuturi/Downloads/log.txt")
  .javaRDD()
  .map(new Function<String, Url>() {
    @Override
    public Url call(String line) throws Exception {
      String[] parts = line.split("\\t");
      Url url = new Url();
      url.setValue(parts[0].replaceAll("[", ""));
      return url;
    }
  });

從RDD創建DataFrame

Dataset<Row> urlsDF = spark.createDataFrame(urlsRDD, Url.class);

RDD到DataFrame - Spark 2.0
RDD到DataFrame - Spark 1.6

你可以做一些事情(我正在從scala轉發,所以借口任何錯別字):

import org.apache.spark.sql.Row
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

JavaRDD<Row> rowRDD = urlrdd.map(new Function<String, Row>() {
    @Override
    public Row call(String record) throws Exception {
        return RowFactory.create(record());
    }
}
// now you wish to create the target schema. This is basically a list of
// fields (each field would be a column) which you are adding to a StructType
List<StructField> fields = new ArrayList<>();
StructField field = DataTypes.createStructField("url", DataTypes.StringType, true);
fields.add(field);
StructType schema = DataTypes.createStructType(fields);

// now you can create the dataframe:
DataFrame df= sqlContext.createDataFrame(rowRDD, schema);    

一些額外的說明:

  • 當你只拿第一個元素時,你為什么要平平? 你可以簡單地完成:

    JavaRDD<String> urlrdd=diskfile.flatMap(line -> line.split("\\t")[0]);

  • 我假設在現實生活中你想從網址中刪除'['(你可以在地圖中輕松地做到這一點)。

  • 如果你要轉向spark 2.0或更高版本,那么你應該使用spark session(spark)來代替sqlContext。

  • 您可以使用所有列創建單個數據框。 您可以通過向架構添加所有字段來實現此目的(即,不只是對字段添加一個添加所有字段)。 而不是使用urlrdd,使用diskfile並在“公共行調用”創建中進行拆分。 這將是這樣的:

    JavaRDD<Row> rowRDD = diskfile.map(new Function<String, Row>() { @override public Row call(String record) throws Exception { String[] recs = record.split("\\t") return RowFactory.create(recs[0], recs[1], ...); } });

  • 您可以直接創建它:只需使用

    sqlContext.read.option("sep","\\t").csv.load(filename,schema)

只需根據7列表平面繪制數據,然后使用下面的代碼段

String[] columns = new String[7] {"clumn1","column2","column3","column4","column5","column6","column7"};
List<String> tableColumns = Arrays.asList(columns);

StrucType schema = createSchema(tableColumns);

    public StructType createSchema(List<String> tableColumns){

        List<StructField> fields  = new ArrayList<StructField>();
        for(String column : tableColumns){         

                fields.add(DataTypes.createStructField(column, DataTypes.StringType, true));            

        }
        return DataTypes.createStructType(fields);
    }

sqlContext.createDataFrame(urlRDD, schema);

您可以直接使用sqlContext直接讀取該文件

使用sqlContext的read方法

有關詳細信息,您可以點擊此鏈接

https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#creating-dataframes

或者你可以導入

import sqlContext.implicits.*;

然后在rdd上使用toDF()方法轉換為數據幀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM