如何通过忽略初始列标题来获得正确的 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 架构?的主要内容,如果未能解决你的问题,请参考以下文章