Java 中来自 List<String> 的数据框

新手上路,请多包涵
  • 星火版本:1.6.2
  • Java 版本:7

我有一个 List<String> 数据。就像是:

 [[dev, engg, 10000], [karthik, engg, 20000]..]

我知道此数据的架构。

 name (String)
degree (String)
salary (Integer)


我试过了:

 JavaRDD<String> data = new JavaSparkContext(sc).parallelize(datas);
DataFrame df = sqlContext.read().json(data);
df.printSchema();
df.show(false);

输出:

 root
 |-- _corrupt_record: string (nullable = true)

+-----------------------------+
|_corrupt_record              |
+-----------------------------+
|[dev, engg, 10000]           |
|[karthik, engg, 20000]       |
+-----------------------------+

因为 List<String> 不是正确的 JSON。

我需要创建一个合适的 JSON 还是有其他方法可以做到这一点?

原文由 Dev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 575
2 个回答

您可以从 List<String> 创建 DataFrame,然后使用 selectExprsplit 获取所需的 DataFrame。

 public class SparkSample{
public static void main(String[] args) {
    SparkConf conf = new SparkConf().setAppName("SparkSample").setMaster("local[*]");
    JavaSparkContext jsc = new JavaSparkContext(conf);
    SQLContext sqc = new SQLContext(jsc);
    // sample data
    List<String> data = new ArrayList<String>();
    data.add("dev, engg, 10000");
    data.add("karthik, engg, 20000");
    // DataFrame
    DataFrame df = sqc.createDataset(data, Encoders.STRING()).toDF();
    df.printSchema();
    df.show();
    // Convert
    DataFrame df1 = df.selectExpr("split(value, ',')[0] as name", "split(value, ',')[1] as degree","split(value, ',')[2] as salary");
    df1.printSchema();
    df1.show();
   }
}

您将获得以下输出。

 root
 |-- value: string (nullable = true)

+--------------------+
|               value|
+--------------------+
|    dev, engg, 10000|
|karthik, engg, 20000|
+--------------------+

root
 |-- name: string (nullable = true)
 |-- degree: string (nullable = true)
 |-- salary: string (nullable = true)

+-------+------+------+
|   name|degree|salary|
+-------+------+------+
|    dev|  engg| 10000|
|karthik|  engg| 20000|
+-------+------+------+

您提供的示例数据有空格。如果你想删除空间并将工资类型设置为“整数”,那么你可以使用 trimcast 函数,如下所示。

 df1 = df1.select(trim(col("name")).as("name"),trim(col("degree")).‌​as("degree"),trim(co‌​l("salary")).cast("i‌​nteger").as("salary"‌​));

原文由 abaghel 发布,翻译遵循 CC BY-SA 3.0 许可协议

DataFrame createNGramDataFrame(JavaRDD<String> lines) {
 JavaRDD<Row> rows = lines.map(new Function<String, Row>(){
    private static final long serialVersionUID = -4332903997027358601L;

    @Override
    public Row call(String line) throws Exception {
        return RowFactory.create(line.split("\\s+"));
    }
 });
 StructType schema = new StructType(new StructField[] {
        new StructField("words",
                DataTypes.createArrayType(DataTypes.StringType), false,
                Metadata.empty()) });
 DataFrame wordDF = new SQLContext(jsc).createDataFrame(rows, schema);
 // build a bigram language model
 NGram transformer = new NGram().setInputCol("words")
        .setOutputCol("ngrams").setN(2);
 DataFrame ngramDF = transformer.transform(wordDF);
 ngramDF.show(10, false);
 return ngramDF;
}

原文由 Vikas Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题