获取CSV到Spark数据帧

时间:2015-04-29 06:43:45

标签: apache-spark pyspark

我在Spark上使用python并希望将csv放入数据帧。

Spark SQL的documentation奇怪地没有提供CSV作为源的解释。

我找到了Spark-CSV,但是文档的两个部分存在问题:

  • "This package can be added to Spark using the --jars command line option. For example, to include it when starting the 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")即使我这样做,这也不行。什么是"来源"这段代码中的参数代表什么?我如何简单地在linux上加载本地文件,比如" /Spark_Hadoop/spark-1.3.1-bin-cdh4/cars.csv"?

8 个答案:

答案 0 :(得分:25)

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

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

请注意,您还可以通过向header=True调用添加关键字参数.csv()来指示csv文件具有标头。还有一些其他选项可供使用,并在上面的链接中进行了描述。

答案 1 :(得分:21)

from pyspark.sql.types import StringType
from pyspark import SQLContext
sqlContext = SQLContext(sc)

Employee_rdd = sc.textFile("\..\Employee.csv")
               .map(lambda line: line.split(","))

Employee_df = Employee_rdd.toDF(['Employee_ID','Employee_name'])

Employee_df.show()

答案 2 :(得分:11)

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

依赖关系:

from pyspark import SparkContext
from pyspark.sql import SQLContext
import pandas as pd

立即将整个文件读入Spark DataFrame:

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'])

答案 3 :(得分:7)

Pyspark的

,假设csv文件的第一行包含标题

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

答案 4 :(得分:6)

遵循Spark 2.0,建议使用Spark Session:

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")

答案 5 :(得分:0)

我遇到了类似的问题。解决方案是添加一个名为" 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。

希望它有效。

答案 6 :(得分:0)

根据Aravind的答案,但更短,例如:

function topLevelNodesOnly(html) {
  let div = document.createElement('div');
  div.innerHTML = html;

  let out = '';
  // using [...someVar] converts array-like things into real arrays
  [...div.childNodes].forEach((node) => {
    // if the node is a text node, add it's text to the output string
    if (node.nodeType === 3) {
      out += node.wholeText;
    } else {
      // if it is anything else, replace it's contents with the text
      // of it's contents
      node.innerHTML = node.textContent;
      // add the html that generated to the output
      out += node.outerHTML;
    }
  });

  return out;
}

console.log(topLevelNodesOnly(`Welcome to my city.  <span class="hello"><span><span>Hello</span> my</span> good</span> friend`));

答案 7 :(得分:0)

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

此外,作为公认的答案,您不需要创建rdd然后执行具有1个潜在问题的架构

当您按原样读取csv时,它将把所有字段标记为字符串,并且当您使用整数列强制实施架构时,您将获得异常。

一种更好的方法是

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