Apache spark spark将CSV转换为libsvm格式

Apache spark spark将CSV转换为libsvm格式,apache-spark,Apache Spark,我有一个CSV文件,以州、年龄、性别、工资等为自变量 因变量为搅动 在spark中,我们需要将数据帧转换为libsvm格式。你能告诉我怎么做吗 libsvm格式为:0 128:51 这里的一个特征值意味着第128列中有51个值。我使用hadoop的目的是相同的,但逻辑应该是相同的。我已经为您的用例创建了示例。在这里,我首先创建数据框,然后删除所有具有空值或空值的行。然后创建RDD并将行转换为libsvm格式。“重新分区(1)”意味着所有内容将只进入一个文件。将有一个结果列,例如,在CTR预测的情

我有一个CSV文件,以州、年龄、性别、工资等为自变量

因变量为搅动

在spark中,我们需要将数据帧转换为libsvm格式。你能告诉我怎么做吗

libsvm格式为:0 128:51


这里的一个特征值意味着第128列中有51个值。

我使用hadoop的目的是相同的,但逻辑应该是相同的。我已经为您的用例创建了示例。在这里,我首先创建数据框,然后删除所有具有空值或空值的行。然后创建RDD并将行转换为libsvm格式。“重新分区(1)”意味着所有内容将只进入一个文件。将有一个结果列,例如,在CTR预测的情况下,它将仅为1或0

示例文件输入:

"zip","city","state","latitude","longitude","timezone","dst"
"00210","Portsmouth","NH","43.005895","-71.013202","-5","1"
"00211","Portsmouth","NH","43.005895","-71.013202","-5","1"
"00212","Portsmouth","NH","43.005895","-71.013202","-5","1"
"00213","Portsmouth","NH","43.005895","-71.013202","-5","1"
"00214","Portsmouth","NH","43.005895","-71.013202","-5","1"
"00215","Portsmouth","NH","43.005895","-71.013202","-5","1"
"00501","Holtsville","NY","40.922326","-72.637078","-5","1"
"00544","Holtsville","NY","40.922326","-72.637078","-5","1"

public class LibSvmConvertJob {

    private static final String SPACE = " ";
    private static final String COLON = ":";

    public static void main(String[] args) {

        SparkConf sparkConf = new SparkConf().setMaster("local[2]").setAppName("Libsvm Convertor");

        JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);

        SQLContext sqlContext = new SQLContext(javaSparkContext);

        DataFrame inputDF = sqlContext.read().format("com.databricks.spark.csv").option("header", "true")
                .load("/home/raghunandangupta/inputfiles/zipcode.csv");

        inputDF.printSchema();

        sqlContext.udf().register("convertToNull", (String v1) -> (v1.trim().length() > 0 ? v1.trim() : null), DataTypes.StringType);

        inputDF = inputDF.selectExpr("convertToNull(zip)","convertToNull(city)","convertToNull(state)","convertToNull(latitude)","convertToNull(longitude)","convertToNull(timezone)","convertToNull(dst)").na().drop();

        inputDF.javaRDD().map(new Function<Row, String>() {
            private static final long serialVersionUID = 1L;
            @Override
            public String call(Row v1) throws Exception {
                StringBuilder sb = new StringBuilder();
                sb.append(hashCode(v1.getString(0))).append("\t")   //Resultant column
                .append("1"+COLON+hashCode(v1.getString(1))).append(SPACE)
                .append("2"+COLON+hashCode(v1.getString(2))).append(SPACE)
                .append("3"+COLON+hashCode(v1.getString(3))).append(SPACE)
                .append("4"+COLON+hashCode(v1.getString(4))).append(SPACE)
                .append("5"+COLON+hashCode(v1.getString(5))).append(SPACE)
                .append("6"+COLON+hashCode(v1.getString(6)));
                return sb.toString();
            }
            private String hashCode(String value) {
                return Math.abs(Hashing.murmur3_32().hashString(value, StandardCharsets.UTF_8).hashCode()) + "";
            }
        }).repartition(1).saveAsTextFile("/home/raghunandangupta/inputfiles/zipcode");

    }
}
“邮政编码”、“城市”、“州”、“纬度”、“经度”、“时区”、“dst”
“00210”、“朴茨茅斯”、“新罕布什尔州”、“43.005895”、“71.013202”、“5”、“1”
“00211”、“朴茨茅斯”、“新罕布什尔州”、“43.005895”、“71.013202”、“5”、“1”
“00212”、“朴茨茅斯”、“新罕布什尔州”、“43.005895”、“71.013202”、“5”、“1”
“00213”、“朴茨茅斯”、“新罕布什尔州”、“43.005895”、“71.013202”、“5”、“1”
“00214”、“朴茨茅斯”、“新罕布什尔州”、“43.005895”、“71.013202”、“5”、“1”
“00215”、“朴茨茅斯”、“新罕布什尔州”、“43.005895”、“71.013202”、“5”、“1”
“00501”、“霍尔茨维尔”、“纽约”、“40.922326”、“72.637078”、“5”、“1”
“00544”、“霍尔茨维尔”、“纽约”、“40.922326”、“72.637078”、“5”、“1”
公共类LibSvmConvertJob{
私有静态最终字符串空间=”;
私有静态最终字符串冒号=“:”;
公共静态void main(字符串[]args){
SparkConf SparkConf=new SparkConf().setMaster(“local[2]”)。setAppName(“Libsvm转换器”);
JavaSparkContext JavaSparkContext=新的JavaSparkContext(sparkConf);
SQLContext SQLContext=新的SQLContext(javaSparkContext);
DataFrame inputDF=sqlContext.read().format(“com.databricks.spark.csv”).option(“header”、“true”)
.load(“/home/raghunandangupta/inputfiles/zipcode.csv”);
inputDF.printSchema();
sqlContext.udf().register(“convertToNull”,(stringv1)->(v1.trim().length()>0?v1.trim():null),DataTypes.StringType);
inputDF=inputDF.selectExpr(“convertToNull(zip)”、“convertToNull(city)”、“convertToNull(state)”、“convertToNull(纬度)”、“convertToNull(经度)”、“convertToNull(时区)”、“convertToNull(dst)”).na().drop();
inputDF.javaRDD().map(新函数(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共字符串调用(第v1行)引发异常{
StringBuilder sb=新的StringBuilder();
sb.append(hashCode(v1.getString(0))).append(“\t”)//结果列
.append(“1”+冒号+哈希代码(v1.getString(1))).append(空格)
.append(“2”+冒号+哈希代码(v1.getString(2))).append(空格)
.append(“3”+冒号+哈希代码(v1.getString(3))).append(空格)
.append(“4”+冒号+哈希代码(v1.getString(4))).append(空格)
.append(“5”+冒号+哈希代码(v1.getString(5))).append(空格)
.append(“6”+冒号+哈希代码(v1.getString(6));
使某人返回字符串();
}
私有字符串哈希代码(字符串值){
返回Math.abs(Hashing.3_32().hashString(value,StandardCharsets.UTF_8).hashCode())+“”;
}
}).repartition(1).saveAsTextFile(“/home/raghunandangupta/inputfiles/zipcode”);
}
}
/*
/Users/mac/matrix.txt
1 0.5 2.4 3.0
1 99 34 6454
2 0.8 3.0 4.5
*/
def concat(a:Array[String]):String={
var结果=a(0)+“
对于(i line.split(“”)).map(i=>concat(i))

我相信我有一个更简单的解决方案。

请更详细地描述您的问题。我不明白您的想法。
/*
/Users/mac/matrix.txt
1 0.5 2.4 3.0
1 99 34 6454
2 0.8 3.0 4.5
*/
def concat(a:Array[String]):String ={
  var result=a(0)+" "
  for(i<-1 to a.size.toInt-1) 
  result=result+i+":"+a(i)(0)+" "
  return result
}
val rfile=sc.textFile("file:///Users/mac/matrix.txt")
val f=rfile.map(line => line.split(' ')).map(i=>concat(i))