如何通过忽略初始列标题来获得正确的 Dataframe 架构?

Posted

技术标签:

【中文标题】如何通过忽略初始列标题来获得正确的 Dataframe 架构?【英文标题】:How to get correct schema of Dataframe by ignoring initial column header? 【发布时间】:2020-07-07 12:17:41 【问题描述】:

我的 csv 文件没有初始一列的标题,因此当我将其转换为 spark 数据框时收到警告说“CSV 标题不符合架构”。

        ,a,b
       1,x,y
       2,x,y
       3,x,y <-- table looks like this (,a,b --> are header).

所以我想忽略初始列标题并获得正确的架构。附注:如果我用任何标题命名初始列,我将获得正确的架构。

【问题讨论】:

【参考方案1】:

数字看起来像一个索引,因此您应该使用 index_col 参数将它们视为一个索引。

将 pandas df 转换为 spark df:https://***.com/a/54709925/11971785

import pandas as pd
import findspark
findspark.init()

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

df_pandas = pd.read_csv(r"...\your_csv.csv", index_col = 0)
df_spark = spark.createDataFrame(df_pandas)
spark_df.createOrReplaceTempView('df_spark')

或者,您可以删除第一行并显式指定标题,如下所示:

df_spark = spark.read.format("csv")\
.option("header", "false")\
.schema(schema=['x', 'a', 'b'])\
.load("...\PATH_to_your_csv")

要动态创建这个明确指定的标题列表,你可以试试这个:

lst_columns = list(spark.textFile("...\PATH_to_your_csv")\
           .mapPartitions(lambda line: csv.reader(line,delimiter=',', quotechar='"'))\
           .filter(lambda line: len(line)==0).toPandas().iloc[0])

【讨论】:

你知道在pyspark中怎么做吗?目前我正在使用这种语法将 csv 读取到 df data_frame=spark.read.format('csv').options(header='true').load(csv_path) 我添加了另一种方法(第二个代码 sn-p)让我知道这是否有效。 它有效,但在我的真实数据集中,我有很多列无法明确指定所有列名!! 您可以尝试加载 csv 的第一行并从中创建标题列表,附加示例(未经测试)【参考方案2】:

所以如果我理解正确的话,基本上你需要重命名列名,这样做在下面使用

df = df.withColumnRenamed('old_column', 'new_column')
df.show()

【讨论】:

以上是关于如何通过忽略初始列标题来获得正确的 Dataframe 架构?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 查询忽略列值

如何将 Excel 列转换为忽略空白单元格的新范围

如何使用HttpRequest对象

如何获得忽略回车的补丁?

如何获得列联表?

如何正确地初始化()一个快速视图控制器?