如何将以竖线分隔的字符串读入数据帧?

时间:2018-10-27 17:22:33

标签: python pandas apache-spark pyspark

我必须将文件读为sparkdatabricksbytes)中,然后将其转换为字符串。

file_bytes.decode("utf-8")

这一切都很好,我有我的数据,用竖线分隔的字符串(包括回车符等)看起来都很不错。像这样:

"Column1"|"Column2"|"Column3"|"Column4"|"Column5"
"This"|"is"|"some"|"data."|
"Shorter"|"line."|||

尽管我希望在dataframe中使用它,以便可以对其进行操作,但最初我尝试使用以下内容:

df = sqlContext.read.format("csv")
  .option("header", "true")
  .option("inferSchema", "true")
  .option("delimiter", '|')
  .load(???)

我很感激load()部分实际上是通往filesystem上某个位置的路径...因此一直在努力与之搏斗。

因此,我已恢复使用pandas,因为它使生活变得更加轻松:

import io
import pandas

temp = io.StringIO(file_bytes.decode("utf-8"))
df = pandas.read_csv(temp, sep="|")

这是pandas dataframe,而不是spark dataframe,据我所知(这是一个非常宽松的认识),它有其优点和缺点与它的生存位置(在内存中)有关,与可伸缩性/集群使用等有关。

最初,我是否有办法使用spark将我的字符串放入dataframe sqlContext中?也许我缺少一些参数或开关等,还是应该坚持使用pandas

我主要担心的是,现在文件很小(200 kb左右),但它们可能不会永远存在,我想重用一种模式,使我可以处理更大的事情(这就是为什么我只关心使用熊猫的原因。)

1 个答案:

答案 0 :(得分:3)

您实际上可以使用CSV阅读器加载字符串的RDD。

http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader

因此,假设lines是您描述的解析字符串的RDD,则可以运行:

df = spark.read.csv(lines, sep='|', header=True, inferSchema=True)

然后CSV源将扫描RDD,而不是尝试加载文件。这样一来,您就可以在解析之前执行自定义的预处理。