web-dev-qa-db-ja.com

Spark=javaでJavaRDDをDataFrameに変換する

LogFileを処理しようとしています。最初にログファイルを読み取り、要件に従ってこれらのファイルを分割し、各列を個別のJavaRDDに保存しました。今、これらのJavaRDDを将来の操作のためにDataFrameに変換する必要があります。これは私が今まで試したコードです:

         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について混乱しています。

誰も私を提案することができます。

ありがとう。

9
Satish Karuturi

インポート:

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、日付、時刻、メソッド、ターゲットなどで構成されるログ行に書き込むことをお勧めします

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);

RDF to DataFrame-Spark 2.
RDF to DataFrame-Spark 1.6

20
mrsrinivas

あなたは次のようなことをすることができます(私は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]);

  • 実際には、URLから「[」を削除することを想定しています(これはマップで簡単に実行できます)。

  • spark 2.0以降に移行する場合は、sqlContextの代わりにspark session(spark)を使用する必要があります。

  • すべての列を持つ単一のデータフレームを作成できます。これを行うには、スキーマにすべてのフィールドを追加します(つまり、フィールドに1回追加するだけでなく、すべてのフィールドを追加します)。 urlrddを使用する代わりに、diskfileを使用して、「public Row call」作成内で分割を行います。これは次のようなものになります。

    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)

5
Assaf Mendelson

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);
4
FaigB

SqlContextを直接使用してファイルを直接読み取ることができます

SqlContextのreadメソッドを使用します

詳細については、このリンクをたどることができます

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

または、インポートすることができます

_import sqlContext.implicits.*;
_

次に、rddでtoDF()メソッドを使用してデータフレームに変換します。

0
Akash Sethi