簡體   English   中英

Java Apache Spark 將 TSV 格式轉換為 JavaRDD

[英]Java Apache Spark get TSV Format into JavaRDD

我需要實現一個 Java Spark 程序來計算給定索引處具有相同列值的元組。 其中命令行參數是[Input path] [column index] [output path] 輸入是一個 TSV 文件,格式為:注冊(入學編號、姓氏、名字、講座、學期)

 1234 Graph Polly Big Data WiSe15 5678 Conda Anna Big Data WiSe16 9012 Jeego Hugh Big Data WiSe16 1234 Graph Polly Data Mining WiSe16 3456 Downe Sid Data Mining WiSe16
我已經開始使用配置來實現設置,但在剩下的任務中迷路了。
 package bigdata; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.SparkConf; public class RelCount { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("RelCount"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD allRows = sc.textFile("file"); JavaRDD line = allRows.map(l->Arrays.asList(l.toString().split("\\t"))); } }

程序的輸出應采用以下形式:

 (Big Data, 3) (Data Mining, 2)

謝謝你的幫助 :)

tsv 是一個以制表符為分隔符的 csv 文件,所以最簡單的方法是使用 Dataframe API 的csv reader來讀取文件。 如果需要,稍后可以將數據幀轉換為 rdd。

首先,獲取一個 Spark 會話:

SparkSession spark = SparkSession.builder()
    .master("local[*]")
    .appName("SparkTest")
    .getOrCreate();

現在可以讀取文件:

Dataset<Row> df = spark.
    read().
    option("delimiter", "\t").
    option("header", false).
    csv(<path to file>);

由於 csv 閱讀器負責格式化業務,因此無需再手動拆分行。

在下一步中,將提取列名稱。 由於讀取器選項header設置為false ,列名稱將是通用名稱,如_c0_c1 ,...在此示例中,我們按第四列(基於 0 索引)分組,因此我們選擇此列名稱。

int index = 3;
String columnname = df.schema().fieldNames()[index];

作為最后一步,我們按所選列對數據框進行分組,並計算每組的行數:

df.groupBy(columnname)
    .count()
    .show();

輸出是:

+-----------+-----+
|        _c3|count|
+-----------+-----+
|Data Mining|    2|
|   Big Data|    3|
+-----------+-----+

如果需要,結果也可以轉換為 rdd:

JavaRDD<Row> rdd = df.groupBy(columnname)
    .count()
    .toJavaRDD();

但通常數據幀 API 比 rdd API方便得多。

暫無
暫無

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

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