Apache spark 获取CSV以触发数据帧

Apache spark 获取CSV以触发数据帧,apache-spark,pyspark,Apache Spark,Pyspark,我在Spark上使用python,希望将csv转换为数据帧 奇怪的是,for Spark SQL没有解释CSV作为源代码 但是,我发现我对文档的两个部分存在问题: “可以使用--jars命令行选项将此程序包添加到Spark中。例如,要在启动Spark shell时包含此程序包:$bin/Spark shell--packages com.databricks:Spark-csv_2.10:1.0.3” 我真的需要在每次启动pyspark或spark submit时添加此参数吗?这似乎很不雅。有

我在Spark上使用python,希望将csv转换为数据帧

奇怪的是,for Spark SQL没有解释CSV作为源代码

但是,我发现我对文档的两个部分存在问题:

  • “可以使用--jars命令行选项将此程序包添加到Spark中。例如,要在启动Spark shell时包含此程序包:$bin/Spark shell--packages com.databricks:Spark-csv_2.10:1.0.3”
    我真的需要在每次启动pyspark或spark submit时添加此参数吗?这似乎很不雅。有没有办法在python中导入它,而不是每次都重新下载它

  • df=sqlContext.load(source=“com.databricks.spark.csv”,header=“true”,path=“cars.csv”)
    即使我执行上述操作,也不会起作用。在这行代码中,“source”参数代表什么?如何在linux上加载本地文件,比如“/Spark\u Hadoop/Spark-1.3.1-bin-cdh4/cars.csv”


将csv文件读入RDD,然后从原始RDD生成RowRDD

创建由StructType表示的模式,该StructType与在步骤1中创建的RDD中的行结构相匹配

通过SQLContext提供的createDataFrame方法将模式应用于行的RDD

lines = sc.textFile("examples/src/main/resources/people.txt")
parts = lines.map(lambda l: l.split(","))
# Each line is converted to a tuple.
people = parts.map(lambda p: (p[0], p[1].strip()))

# The schema is encoded in a string.
schemaString = "name age"

fields = [StructField(field_name, StringType(), True) for field_name in schemaString.split()]
schema = StructType(fields)

# Apply the schema to the RDD.
schemaPeople = spark.createDataFrame(people, schema)

来源:

我遇到了类似的问题。解决方案是添加一个名为“PYSPARK_SUBMIT_ARGS”的环境变量,并将其值设置为“-packages com.databricks:spark-csv_2.10:1.4.0 PYSPARK shell”。这适用于Spark的Python交互式shell

确保spark csv的版本与安装的Scala版本相匹配。对于Scala 2.11,它是spark-csv_2.11;对于Scala 2.10或2.10.5,它是spark-csv_2.10


希望它能工作。

如果您不介意额外的包依赖性,您可以使用Pandas解析CSV文件。它可以很好地处理内部逗号

依赖项:

from pyspark import SparkContext
from pyspark.sql import SQLContext
import pandas as pd
立即将整个文件读入Spark数据帧:

sc = SparkContext('local','example')  # if using locally
sql_sc = SQLContext(sc)

pandas_df = pd.read_csv('file.csv')  # assuming the file contains a header
# If no header:
# pandas_df = pd.read_csv('file.csv', names = ['column 1','column 2']) 
s_df = sql_sc.createDataFrame(pandas_df)
或者,更有意识地,您可以将数据分块到Spark RDD中,然后是DF:

chunk_100k = pd.read_csv('file.csv', chunksize=100000)

for chunky in chunk_100k:
    Spark_temp_rdd = sc.parallelize(chunky.values.tolist())
    try:
        Spark_full_rdd += Spark_temp_rdd
    except NameError:
        Spark_full_rdd = Spark_temp_rdd
    del Spark_temp_rdd

Spark_DF = Spark_full_rdd.toDF(['column 1','column 2'])

在Spark 2.0之后,建议使用Spark会话:

from pyspark.sql import SparkSession
from pyspark.sql import Row

# Create a SparkSession
spark = SparkSession \
    .builder \
    .appName("basic example") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

def mapper(line):
    fields = line.split(',')
    return Row(ID=int(fields[0]), field1=str(fields[1].encode("utf-8")), field2=int(fields[2]), field3=int(fields[3]))

lines = spark.sparkContext.textFile("file.csv")
df = lines.map(mapper)

# Infer the schema, and register the DataFrame as a table.
schemaDf = spark.createDataFrame(df).cache()
schemaDf.createOrReplaceTempView("tablename")

随着Spark的更新版本(我相信,从1.4开始),这变得容易多了。表达式
sqlContext.read
使用
.csv()
方法提供了一个实例:

df = sqlContext.read.csv("/path/to/your.csv")

请注意,您还可以通过将关键字参数
header=True
添加到
.csv()
调用来指示csv文件有一个头。还有一些其他选项可用,如上面的链接所述。

基于Aravind的答案,但要短得多,例如:

lines = sc.textFile("/path/to/file").map(lambda x: x.split(","))
df = lines.toDF(["year", "month", "day", "count"])

对于Pyspark,假设csv文件的第一行包含一个头文件

spark = SparkSession.builder.appName('chosenName').getOrCreate()
df=spark.read.csv('fileNameWithPath', mode="DROPMALFORMED",inferSchema=True, header = True)

对于当前的实现(spark 2.X),您不需要添加packages参数,您可以使用内置的csv实现

此外,作为公认的答案,您不需要创建rdd,然后强制实施有1个潜在问题的模式

当您读取csv as时,它会将所有字段标记为字符串,当您使用整数列强制执行模式时,您会得到异常

更好的方法是

 spark.read.format("csv").schema(schema).option("header", "true").load(input_path).show() 

这个答案有好几次投票,但我不太清楚到底发生了什么-您创建SQLContext(sc)并调用该SQLContext,然后您就什么都不做了。。那只是多余的代码吗?当我用齐柏林飞艇笔记本中的一个简单csv文件尝试相同的代码时,我得到了错误:
Traceback(最近一次调用):file”/tmp/zeppelin_pyspark-7664300769638364279.py),eval(compiledCode)文件“”中第252行,AttributeError中第1行:“int”对象没有属性“map”
请共享您的代码,以获取帮助。我已经在多个实例中使用了该代码,但没有出现问题。您没有显示
sc
是什么。如果是SparkContext(),则应在代码示例中显示赋值。createDataFrame通常会给出如下错误:IllegalArgumentException:“实例化'org.apache.spark.sql.hive.HiveSessionState'时出错:”。。。有没有这样的经验?这个答案很古老,新版本的spark有更简单的方法来实现。请参阅答案,当我调用此命令时,收到错误,
AttributeError:“property”对象没有属性“csv”
。实际上,我错过了最重要的
sqlContext=sqlContext(sc)
——现在可以正常工作了
 spark.read.format("csv").schema(schema).option("header", "true").load(input_path).show()