spark 2.x使用csv函数读取整数/双列作为字符串

时间:2017-08-31 09:34:40

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我正在使用以下声明在spark中阅读csv。

df = spark.read.csv('<CSV FILE>', header=True, inferSchema = True)

当我检查spark数据帧时,一些整数和双列在数据帧中存储为字符串列。但是,所有列都不是这种情况。

我检查了特定列的值,所有值都是double类型,但仍然是spark推断为StringType。

由于我正在加载大约1000列的CSV文件,因此也无法明确指定架构。

任何建议/帮助都将受到高度赞赏。

此致

Neeraj

1 个答案:

答案 0 :(得分:0)

考虑到模式不会改变中间表(浮动将保持浮动通过行)。 您可以编写一个小脚本来自动投射它们:

def isfloat(x):
    try:
        float(x)
    except :
        return False
    else:
        return True
line1 = df.head(1)[0]

df = df.select([c for c in df.columns if not isfloat(line1[c])] + [df[c].cast("float").alias(c) for c in df.columns if isfloat(line1[c])])

如果你认为第一行没有足够的信息,你可以这样做

N = 10
def isfloat(c):
    try:
        [float(x) in c]
    except :
        return False
    else:
        return True
Nlines = df.limit(N).toPandas()
df = df.select([c for c in df.columns if not isfloat(Nlines[c])] + [df[c].cast("float").alias(c) for c in df.columns if isfloat(Nlines[c])])