【问题标题】:How to read csv without header and name them with names while reading in pyspark?如何在 pyspark 中读取没有标题的 csv 并用名称命名它们?
【发布时间】:2017-11-17 09:28:37
【问题描述】:
100000,20160214,93374987
100000,20160214,1925301
100000,20160216,1896542
100000,20160216,84167419
100000,20160216,77273616
100000,20160507,1303015

我想读取第一行没有列名的 csv 文件。 如何阅读它并同时用我指定的名称命名列? 现在,我只是用我指定的名称重命名了原始列,如下所示:

df = spark.read.csv("user_click_seq.csv",header=False)
df = df.withColumnRenamed("_c0", "member_srl")
df = df.withColumnRenamed("_c1", "click_day")
df = df.withColumnRenamed("_c2", "productid")

还有更好的方法吗?

【问题讨论】:

    标签: dataframe pyspark


    【解决方案1】:

    您可以将 csv 文件导入到具有预定义架构的数据框中。定义模式的方式是使用StructTypeStructField 对象。假设你的数据都是IntegerType数据:

    from pyspark.sql.types import StructType, StructField, IntegerType
    
    schema = StructType([
        StructField("member_srl", IntegerType(), True),
        StructField("click_day", IntegerType(), True),
        StructField("productid", IntegerType(), True)])
    
    df = spark.read.csv("user_click_seq.csv",header=False,schema=schema)
    

    应该可以。

    【讨论】:

    • 谢谢。如果该列是字符串类型,那么我将把 IntegerType() 替换为 StringType(),对吗?
    • 是的,只要确保从pyspark.sql.types导入StringType
    【解决方案2】:

    对于那些想在 scala 中执行此操作并且可能不想添加类型的人:

    val df = spark.read.format("csv")
                       .option("header","false")
                       .load("hdfs_filepath")
                       .toDF("var0","var1","var2","var3")
    

    【讨论】:

      【解决方案3】:

      在我的例子中,它处理了很多列并且创建模式非常繁琐,此外,spark 很好地推断了模式。 所以我选择使用选择重命名它。

      首先我用新名称创建一个列表:

      val listNameColumns: List[String] = List("name1", "name2" , "name3")
      

      然后我将原始数据框的列名与上面的列表结合起来,创建一个 Column 元素列表:

      import org.apache.spark.sql.Column
      import org.apache.spark.sql.functions.col
      val selectStament: Array[Column] = df.columns zip listNameColumns map { case(a, b) =>  col(a).as(b)}
      

      最后我做出选择:

      val dfRenamed = df.select(selectStament:_*)
      

      【讨论】:

        【解决方案4】:

        您可以使用header=False 读取数据,然后使用toDF 传递列名,如下所示:

        data = spark.read.csv('data.csv', header=False)
        data = data.toDF('name1', 'name2', 'name3')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-03
          • 2018-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多